Practice

发布时间 2023-06-29 17:15:41作者: 假行僧me

1.有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

逻辑分析:

先进行乱序排列,最后去除不符合条件(即有两个及以上在数组中具有相同位置的元素)的排列。

示例代码:
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 //arrange numbers in an specified digit and print them
  5 
  6 int arrange_num(int n, int m)
  7 {   
  8     int i;
  9     int multi = 1; 
 10     for(i = 0; i < m; i++)
 11     {   
 12         multi *= n - i;
 13     }
 14     
 15     return multi;
 16 }
 17 
 18 void res(int *q, int a)
 19 {
 20     int i, j, k; 
 21     for(i = 0; i < a; i++)
 22     {
 23         for(j = 0;j < a;j++)
 24         {   
 25             for(k = 0; k < a; k++)
 26             {
 27                 if(i != j && j != k && i != k)
 28                     printf("%d%d%d\n", q[i], q[j], q[k]);
 29             }
 30         }
 31     }
 32 }
 33 
 34 int main()
 35 {
 36     int ele_num;
 37     printf("Please input the number of elements in array you want to arrange: ");
 38         scanf("%d", &ele_num);
 39     printf("\n");
 40 
 41     int *p = NULL;
 42     p = malloc(sizeof(int) * ele_num);
 43 
 44     if(p == NULL)
 45     {
 46         printf("Error in malloc!!!\n");
 47 
 48         exit(1);
 49     }
 50 
 51     printf("Please input array elements you want to arrange:\n");
 52     int i;
 53     for(i = 0; i < ele_num; i++)
 54         scanf("%d",&p[i]);
 55 
 56     int digit;
 57     printf("Please input the digits of number you want to arrange: ");
 58     scanf("%d",&digit);
 59 
 60     int num = arrange_num(ele_num, digit);
 61     printf("\nthis array you can arrange : %d  times.\n", num);
 62 
 63     res(p, ele_num);
 64     free(p);
 65     p = NULL;
 66 
 67     exit(0);
 68 }
运行结果:
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./1
Please input the number of elements in array you want to arrange: 4

Please input array elements you want to arrange:
1 2 3 4
Please input the digits of number you want to arrange: 3

this array you can arrange : 24  times.
123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432

2.企业发放的奖金根据利润提成。

  • 利润(I)低于或等于10万元时,奖金可提10%;
  • 利润高于10万元,低于20万元时,等于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
  • 20万到40万之间时,高于20万元的部分,可提成5%;
  • 40万到60万之间时高于40万元的部分,可提成3%;
  • 60万到100万之间时,高于60万元的部分,可提成1.5%;
  • 高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数?
逻辑分析:

小于等于十万时,奖金 = 利润 * 0.1
高于十万低于二十万时,奖金 = 100000 * 0.1 + (利润 - 100000)
以此类推······

示例代码:
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 double bonus(double i)
  5 {
  6     //100000 <= i <= 200000, bonus2 = bonus1 + 0.075 * (i - 100000)
  7     //200000 <= i <= 400000, bonus3 = bonus2 + 0.05 * (i - 200000)
  8     //400000 <= i <= 600000, bonus4 = bonus3 + 0.03 * (i - 400000)
  9     //600000 <= i <= 1000000, bonus5 = bonus4 + 0.015 * (i - 600000)
 10     //i >= 1000000, bonus6 = bonus5 + 0.01 * (i - 1000000)
 11 
 12     double bon_0 = 100000 * 0.1, bonus1 = 0, bonus2 = 0, bonus3 = 0, bonus4 = 0, bonus5 = 0, bonus6 = 0;
 13     double bon[6] = {bonus1, bonus2, bonus3, bonus4, bonus5, bonus6};
 14     bon[0] = 0.1 * i;
 15     bon[1] = bon_0  + 0.075 * (i - 100000);
 16     bon[2] = bon[1] + 0.05  * (i - 200000);
 17     bon[3] = bon[2] + 0.03  * (i - 400000);
 18     bon[4] = bon[3] + 0.015 * (i - 600000);
 19     bon[5] = bon[4] + 0.01  * (i - 1000000);
 20     //i <= 100000
 21     if(i <= 100000)
 22         return bon[0];
 23     //100000 <= i <= 200000
 24     else if(i <= 200000)
 25         return bon[1];
 26     //200000 <= i <= 400000
 27     else if(i <= 400000)
 28         return bon[2];
 29     //400000 <= i <= 600000
 30     else if(i <= 600000)
 31         return bon[3];
 32     //600000 <= i <= 1000000
 33     else if(i <= 1000000)
 34         return bon[4];
 35     //i > 1000000
 36     else
 37         return bon[5];
 38 
 39 }
 40 
 41 int main()
 42 {
 43     double I;
 44     printf("Please input profit : ");
 45     scanf("%lf",&I);
 46 
 47     double money = bonus(I);
 48     printf("the bonus you get is : %lf\n", money);
 49 
 50     exit(0);
 51 }

执行结果:

Please input profit : 120000
the bonus you get is : 11500.000000

3.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

完全平方数:即可以表示成某个整数的平方

程序分析:
  • 设这个整数为a,则有a + 100 = m²,a + 100 + 168 = n²a,m,n,均为整数;
  • 其中有:m² - n² = 168 --> (m + n)(m - n) = 168 --> i * j = 168,这里是循环条件,为i或者j寻找一个初值2,确定一个变量的取值范围;
  • m = (i - j) / 2, n = (i + j) / 2,可知 (i + j)(i - j)均为偶数即对2取余等于0
示例代码:
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <math.h>
  4 
  5 int main()
  6 {
  7     int a, m, n, i, j; 
  8     for(i = 2; i < 168 / 2 + 1; i++)
  9     {
 10        j = 168 / i;
 11        if(i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)  //限制i > j,即m,n均为正数
 12         {   
 13             n = (i + j) / 2;
 14             m = (i - j) / 2;
 15             if(pow(n,2) - pow(m,2) == 168)
 16             {   
 17                 a = pow(m,2) - 100;
 18                 printf("%d + 100 = %d ^2\n", a, m);
 19                 printf("%d + 100 + 168 = %d ^2\n", a, n);
 20                 printf("a = %d\n",a);
 21             }
 22         }
 23     }
 24     
 25     exit(0);
 26 }
执行结果:
-99 + 100 = 1 ^2
-99 + 100 + 168 = 13 ^2
a = -99
21 + 100 = 11 ^2
21 + 100 + 168 = 17 ^2
a = 21
261 + 100 = 19 ^2
261 + 100 + 168 = 23 ^2
a = 261
1581 + 100 = 41 ^2
1581 + 100 + 168 = 43 ^2
a = 1581

4.输入某年某月某日,判断这一天是这一年的第几天?

逻辑分析:

已知数据:年,月,日。
年:闰年与平年 :366 天与365 天;

判断依据:如果这个年份可以被400整除,或者可以被4整除但不能被100整除,就是闰年,否则为平年。

月:如果为平年,2月就是28天,闰年,2月为29天。
计算是哪一天,输入的月份的前几个月天数进行累加在上这个月的那一天就等于该年的第多少天。

示例代码:
#include <stdio.h>
#include <stdlib.h>

//判断闰年与平年: 闰年返回366,平年返回值365
int year_type(int a)
{
    if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0 )
        return 366;
    return 365;
}

int main()
{
	int year, month, day;
	printf("\n请在相应的选项中输入年月日:\n\n");
    printf("请输入年份:");
    scanf("%d",&year);
    printf("\n请输入月份:");
    scanf("%d",&month);
    printf("\n请输入几号:");
    scanf("%d",&day);
    printf("\n");

	int jan = 31,mar = 31,apr = 30,may = 31,june = 30,july = 31,aug = 31,sep = 30,oct = 31,nov = 30,dec = 31;
    int feb;
	int y_num = year_type(year);
    
    if(y_num == 366)
        feb = 29;
    else
        feb = 28;

    int mon_day[12] = {jan,feb,mar,apr,may,june,july,aug,sep,oct,nov,dec};
    int mon_num[12] = {  1, 2,  3,  4,  5,   6,   7,  8,  9,  10, 11, 12};
    int data = 0;
    int mon_total = 0;
    int i,j;
    
    for(i = 0; i < 12; i++)
    {
        if(month == mon_num[i])
        {
            for(j = 0; j < i; j++)
            {
                mon_total += mon_day[j];
          
			}
        }
    }
    data = mon_total + day;
    printf("您输入的日期是%d年的第%d天!\n", year, data);
    
    exit(0);
}
执行结果:
请在相应的选项中输入年月日:

请输入年份:2022

请输入月份:10

请输入几号:6

您输入的日期是2022年的第279天!

5.输入三个整数x,y,z,请把这三个数由小到大输出。

逻辑分析:

这三个数将其存储到数组中。使用4种排序方法来实现:顺序排序,选择排序,冒泡排序,快速排序。

示例代码:
#include <stdio.h>
#include <stdlib.h>
//自定义要进行排序的元素个数 N 以及元素值,使用下面的排序方法实现元素由小到大进行排列

//1.冒泡排序
void bubble_sort(int *arr, int len)
{
    int i, j, tmp;
    for(i = 0; i < len - 1; i++)
    {
        for(j = 0; j < len - 1 - i; j++)
        {
            if(arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    printf("\n冒泡排序的排序结果:");

    for(i = 0; i < len; i++ )
    {
        printf("%d  ",arr[i]);
    }

    printf("\n");
}

//2.选择排序
void selection_sort(int *arr, int len)
{
    int i, j, tmp, min;
    for(i = 0; i < len - 1; i++)
    {
        min = i;
        for(j = i + 1; j < len - 1; j++)
        {
            if(arr[min] > arr[j])  //求最小值
            {
                min = j;
            }
        }
        if(min != i)  //交换值
        {
             tmp = arr[i];
             arr[i] = arr[min];
             arr[min] = tmp;
        }
    }

    printf("\n选择排序的排序结果:");

    for(i = 0; i < len; i++ )
    {
        printf("%d  ",arr[i]);
    }

    printf("\n");

}

//3.快速排序
typedef struct _Range 
{
    int start, end;
}Range;

Range new_Range(int s, int e) 
{
    Range r;
    r.start = s;
    r.end = e;
    return r;
}

void swap(int *x, int *y) 
{
    int t = *x;
    *x = *y;
    *y = t;
}
#if 0
//1.迭代法
void quick_sort(int *arr, const int len)
{
    if (len <= 0)
        return; // 避免len等于负值时引发段错误(Segment Fault)

    // r[]模拟列表,p为数量,r[p++]为push,r[--p]为pop且取得元素
    Range r[len];
    int p = 0;
    r[p++] = new_Range(0, len - 1);
    while (p) 
    {
        Range range = r[--p];
        if (range.start >= range.end)
            continue;
        int mid = arr[(range.start + range.end) / 2]; // 選取中間點為基準點
        int left = range.start, right = range.end;
        
        do
        {
            while (arr[left] < mid) ++left;   // 檢測基準點左側是否符合要求
            while (arr[right] > mid) --right; //檢測基準點右側是否符合要求
 
            if (left <= right)
            {
                swap(&arr[left],&arr[right]);
                left++;right--;               // 移動指針以繼續
            }
        } while (left <= right);
 
        if (range.start < right) r[p++] = new_Range(range.start, right);
        if (range.end > left) r[p++] = new_Range(left, range.end);
    }
    printf("\n快速排序的排序结果:");
    int i;
    for(i = 0; i < len; i++ )
    {
        printf("%d  ",arr[i]);
    }

    printf("\n");

}
#endif
//2.递归法
void quick_sort_recursive(int *arr, int start, int end) 
{
    if (start >= end)
        return;
    int mid = arr[end];
    int left = start, right = end - 1;
    while (left < right) 
    {
        while (arr[left] < mid && left < right)
            left++;
        while (arr[right] >= mid && left < right)
            right--;
        swap(&arr[left], &arr[right]);
    }
    if (arr[left] >= arr[end])
        swap(&arr[left], &arr[end]);
    else
        left++;
    if (left)
        quick_sort_recursive(arr, start, left - 1);
    quick_sort_recursive(arr, left + 1, end);
}
void quick_sort(int *arr, int len) 
{
    quick_sort_recursive(arr, 0, len - 1);
    printf("\n快速排序的排序结果:");
    int i;
    for(i = 0; i < len; i++ )
    {
        printf("%d  ",arr[i]);
    }

    printf("\n");


}

//主函数
int main()
{
    printf("请输入实现排序的元素个数:");
    int num, i;
    int *p;
    p = NULL;

    scanf("%d", &num);
    printf("\n");

    p = malloc(sizeof(int) * num);
    if(p == NULL)
    {
        printf("空间分配出错!\n");
        return 0;
    }

    printf("请输入实现排序的具体元素(int类型):\n");
    for(i = 0; i < num; i++)
    {
        scanf("%d", &p[i]);
    }
    printf("\n");
    
    printf("你输入的这些数据为:");
    for(i = 0; i < num; i++)
    {
        printf("%d  ",p[i]);
    }
    printf("\n");

    bubble_sort(p, num);
    selection_sort(p, num);
    quick_sort(p, num);

    exit(0);
}
执行结果:
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./sort 
请输入实现排序的元素个数:9

请输入实现排序的具体元素(int类型):
1
2
3
65
98
56
1
56
45

你输入的这些数据为:1  2  3  65  98  56  1  56  45  

冒泡排序的排序结果:1  1  2  3  45  56  56  65  98  

选择排序的排序结果:1  1  2  3  45  56  56  65  98  

快速排序的排序结果:1  1  2  3  45  56  56  65  98  

6. 输出9*9口诀

逻辑分析:

将其视为二维数组,即9行9列,输出满足:行号 >= 列号的结果即可,换行条件是:行号 = 列号。

示例代码:
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(int argc, int *argv[])
  5 {
  6     int i, j;
  7     
  8     for(i = 0; i < 9; i++)
  9     {   
 10         for(j = 0; j < 9; j++)
 11         {   
 12             if(i >= j)
 13             {  
 14                printf("%4d * %d = %d", j + 1, i + 1, (i + 1) * (j + 1));
 15                if(i == j)
 16                    printf("\n");
 17             }
 18         }
 19     }
 20     
 21     return 0;
 22 }
执行结果:
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./5
   1 * 1 = 1
   1 * 2 = 2   2 * 2 = 4
   1 * 3 = 3   2 * 3 = 6    3 * 3 = 9
   1 * 4 = 4   2 * 4 = 8    3 * 4 = 12   4 * 4 = 16
   1 * 5 = 5   2 * 5 = 10   3 * 5 = 15   4 * 5 = 20   5 * 5 = 25
   1 * 6 = 6   2 * 6 = 12   3 * 6 = 18   4 * 6 = 24   5 * 6 = 30   6 * 6 = 36
   1 * 7 = 7   2 * 7 = 14   3 * 7 = 21   4 * 7 = 28   5 * 7 = 35   6 * 7 = 42   7 * 7 = 49
   1 * 8 = 8   2 * 8 = 16   3 * 8 = 24   4 * 8 = 32   5 * 8 = 40   6 * 8 = 48   7 * 8 = 56   8 * 8 = 64
   1 * 9 = 9   2 * 9 = 18   3 * 9 = 27   4 * 9 = 36   5 * 9 = 45   6 * 9 = 54   7 * 9 = 63   8 * 9 = 72   9 * 9 = 81

7.利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

逻辑分析

使用(a > b) ? a : b: a 如果大于b,那么就返回a的值,否则返回b的值转换成if-else就是:

//使用变量grade接收返回值
if(a > b)
{
    grade = a;
}
else
{
    grade = b;
}

grade >= 90 返回A, 60 <= grade <= 89 返回B, grade < 60 返回C.
--> grade_level = (grade >= 90) ? 'A' : ((grade >= 60)? 'B' : 'C')

只需嵌套一次即可,因为除了大于等于90的就是小于60与大于60的了,而大于60的直接就使用一次嵌套即可。

示例代码
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main()
  5 {
  6     char grade_level;
  7     int grade;
  8     
  9     printf("Please input the grade : ");
 10     scanf("%d",&grade);
 11     
 12     grade_level = (grade >= 90) ? 'A' : ((grade >= 60) ? 'B' : 'C');
 13     
 14     printf("the level of grade is %c\n",grade_level);
 15     
 16     exit(0);
 17 }
执行结果
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./7
Please input the grade : 60
the level of grade is B
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./7
Please input the grade : 50
the level of grade is C
jxs@jxs-ubuntu:~/Desktop/c  language/tests$ ./7
Please input the grade : 94
the level of grade is A