C基础的练习集及测试答案(16-30)

16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)

 1 #if 0
 2 16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,
 3 则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)

  解题思路:
  一。各个数据的包含关系:
  能被4整除 包含 能被100整除 包含 能被400整除
  二。多分支判断,从最小集合开始判断则判断条件最为简单;

 4 #endif
 5 #include<stdio.h>
 6 
 7 int main(){
 8     int year;
 9     scanf("%d",&year);
10     
11     if((year%400)==0){
12         printf("%d是闰年",year);
13     }else if((year%100)==0){
14         printf("%d不是闰年",year);
15     }else if((year%4)==0){
16         printf("%d是闰年",year);
17     }else{
18         printf("%d不是闰年",year);
19     }
20     return 0;
21 }


17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,0~59为不及格,其他则输出错误信息。要求使用switch实现。

 1 #if 0
 2 17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,
 3 0~59为不及格,其他则输出错误信息。要求使用switch实现。
 4 
 5 解题思路:
 6 一。判断数据是否合法;
 7 二。提取分数的十位进行switch判断。
 8 
 9 #endif
10 #include<stdio.h>
11 int main(){
12     int grade;
13     scanf("%d",&grade);
14     if((grade>100)||(grade<0)){
15         printf("%d数据不合法",grade);
16     }
17     grade/=10;
18     switch(grade){
19         case 10:
20         case 9: 
21             printf("%d等级为:优",grade);
22         break;
23         case 8: 
24             printf("%d等级为:良",grade);
25         break;
26         case 7: 
27             printf("%d等级为:中",grade);
28         break;
29         case 6: 
30             printf("%d等级为:及格",grade);
31         break;
32         default:
33             printf("%d等级为:不及格",grade);
34         
35         
36     }
37     printf("%lf",(grade*0.4));
38     
39     return 0;
40 }

 


18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
freight = weight * distance * price * (1-discount);
路程与折扣的关系如下:
s<250:无折扣
250<=s<500:2%折扣
500<=s<1000:5%折扣
1000<=s<2000:8%折扣
2000<=s<3000:10%折扣
3000<=s:15%折扣
要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。

 1 #if 0
 2 18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
 3 freight = distance * distance * price * (1-discount);
 4 路程与折扣的关系如下:
 5 s<250:无折扣
 6 250<=s<500:2%折扣
 7 500<=s<1000:5%折扣
 8 1000<=s<20008%折扣
 9 2000<=s<300010%折扣
10 3000<=s:15%折扣
11 要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。

  解题思路:
  一。将重量进行分段,对每段重量的费用进行计算。
  二。从大重量向小重量遍历计算比小重量向大重量计算各直观
  例如
  大到小:向算先算一千到一百,自减九百,再算一百到零,
  小到大:先算零到一百,自减一百,再算零至900;
  三。依次从大到小判断重量的大小,计算对应重量的费用,然后重量相应自减已计算重量。

12 #endif
13 
14 
15 
16 #include<stdio.h>
17 int fun(int distance,int price,int weight){
18     int freight=0;
19     if(distance>=3000){
20         freight+=(distance-3000)*price*8.5*weight;
21         printf("
%d=(%d-3000)*%d*0.9*%d
",freight,distance,price,weight);
22         distance=3000;
23         
24     }
25     if(distance>=2000){
26         freight+=(distance-2000)*price*0.90*weight;
27         printf("
%d=(%d-2000)*%d*0.9*%d
",freight,distance,price,weight);
28         distance=2000;
29         
30     }
31     if(distance>=1000){
32         freight+=(distance-1000)*price*0.92*weight;
33         printf("
%d=(%d-3000)*%d*0.9*%d
",freight,distance,price,weight);
34         distance=1000;
35         
36     }
37     if(distance>=500){
38         freight+=(distance-500)*price*0.95*weight;
39         printf("
%d=(%d-3000)*%d*0.9*%d
",freight,distance,price,weight);
40         distance=500;
41     }    
42     if(distance>=250){
43         freight+=(distance-250)*price*0.95*weight;
44         printf("
%d=(%d-250)*%d*0.9*%d
",freight,distance,price,weight);
45         distance=250;
46         
47     }
48     if(distance>=0){
49         freight+=(distance)*price*weight;
50         printf("
%d=(%d-3000)*%d*%d
",freight,distance,price,weight);
51     }
52     if(distance<0){
53         printf("
%d路程不能为负",distance);
54     }
55     
56     return freight;
57 }
58 
59 int main(){
60     int distance,price, weight;
61     int freight;
62     printf("输入 ;重量  单价  路程: ");
63     scanf("%d %d %d",&weight,&price,&distance);
64     //printf("%d %d %d",distance,unit,distance);
65     freight=fun(distance,price,weight);
66     printf("
总价为:%d
",freight);
67     
68     return 0;
69 }

19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。

 1 //19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。
  //解题思路:for()和while互为语法糖,当循环超过一次是while()、do-while()等价;
2 #include<stdio.h> 3 4 int fun_while(int num){ 5 int sum=0; 6 int i=1; 7 while(i<=num){ 8 sum+=i; 9 i++; 10 } 11 12 13 return sum; 14 } 15 int fun_dowhile(int num){ 16 int sum=0; 17 int i=1; 18 do{ 19 sum+=i; 20 i++; 21 }while(i<=num); 22 return sum; 23 } 24 25 int fun_for(int num){ 26 int sum=0; 27 int i=1; 28 for(i=1;i<=num;i++){ 29 sum+=i; 30 31 } 32 return sum; 33 } 34 35 int main(){ 36 int sum1,sum2,sum3; 37 sum1=fun_while(100); 38 sum2=fun_dowhile(100); 39 sum3=fun_for(100); 40 printf("while=%d ,dowhile=%d ,for=%d",sum1,sum2,sum3); 41 return 0; 42 }

20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。

 1

  #if 0
  20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。
  解题思路:
  一。遍历100至999;每次分别提取个十百位上的数;
  二。判断对每次提取的数进行立方和,对比和本身是否相等从而确定水仙花数。

  #endif

 2 #include<stdio.h>
 3 void shuixian(){
 4     int i=100;
 5     while(i<=999){
 6         
 7         int ge=i%10;
 8         int bai=i/100;
 9         int shi=(i/10)%10;
10         //printf("%d  %d %d ",bai,shi,ge);
11         int sum=(ge*ge*ge)+(shi*shi*shi)+(bai*bai*bai);
12             //printf("
%d
",sum);
13         if(sum==i){
14             printf("
%d
",sum);
15         }
16         i++;
17     }
18     
19 }
20 
21 
22 int main(){
23     shuixian();
24     return 0;
25 }


21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1 + Fn-2 (n>=3)

 1 #if 0
 2 21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
 3 F1=1            (n=1)
 4 F2=1            (n=2)
 5 Fn=Fn-1 + Fn-2  (n>=3)

  解题思路:
  一。应该建立一个数组来存储产生的斐波那契数列,但没有对数列的操作,所以不存储直接输出
  二。使用两个标志位存储n-1 和n-2 的值,由此产生n的值。

 6 #endif
 7 
 8 #include<stdio.h>
 9 
10 void fei(int len){
11     int one=1;
12     int two=1;
13     int i;
14     printf("%d
 %d 
",one,two);
15     for(i=3;i<=len;i++){
16         int temp=two;
17         two+=one;
18         one=temp;
19         printf("%d
",two);
20     }
21 }
22 int main(){
23     int n;
24     printf("打印多少项");
25     scanf("%d",&n);
26     
27     fei(n);
28     
29     return 0;
30 }


22、(课堂)输出如下图形:
*
***
*****
*******
*********
……
其中需要输出几行由键盘输入。

 1 #if 0
 2 22、(课堂)输出如下图形:
 3      4*1
 4     3***3
 5    2*****5
 6   1*******7
 7  0*********9
 8 ……5
 9 其中需要输出几行由键盘输入。

  解题思路:
  一。确定输出多少行;
  二。第i行的空格数:总行数-i
  第i行的*数:i*2-1

10 #endif
11 #include<stdio.h>
12 
13 void sanjiao(int len){
14     //第I次输出几个*   i*2-1
15     //第i次空几个      i-1
16     
17     int kong,xiang,i;
18     for(i=1;i<=len;i++){
19         //printf("%d",i);
20         //printf("%d",i);
21         
22         for(kong=len-i;kong>=0;kong--){
23             printf(" ");
24         }
25         for(xiang=(i*2-1);xiang>=1;xiang--){
26             printf("*");
27             
28         }
29         printf("
");
30     }
31     
32     
33     
34 }
35 
36 int main(){
37     int hang;
38     printf("输出几行三角");
39     scanf("%d",&hang);
40     sanjiao(hang);
41     
42     
43     
44     return 0;
45 }


23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。列举出所有的购买方案,以及列举出所有花光100元的购买方案

 1

  #if 0
  23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。
  列举出所有的购买方案,以及列举出所有花光100元的购买方案

  解题思路:
  一。排除各买一件则剩余70元。
  二。建立一个三重循环,分别代表笔记本,尺子,笔。可以遍历所有情况。总价恰好为70则为结果。


  错误分析:
  大O算法为n^3 ,算法效率太低。有待改进。
  #endif

 3 #include<stdio.h>
 4 
 5 void wenju(int money){
 6     money-=(20+6+4);//30 70
 7     int notebook,rule,pen;
 8     for(notebook=0;notebook<=3;notebook++){
 9         for(rule=0;rule<=11;rule++){
10             for(pen=0;pen<=17;pen++){
11                 if(notebook*20+rule*6+pen*4==70){
12                     printf("notebook=%d*20 ,rule=%d*6,pen=%d*4=70 
",notebook,rule,pen);
13                 }
14             }
15         }
16     }
17 }
18 
19 int main(){
20     //组合正好一百元;
21     wenju(100);
22 }

24、(课堂)输出100~200间的所有素数

 1

  #if 0
  24、(课堂)输出100~200间的所有素数
  解题思路:
  一。遍历100~200,每个数取余 2至n/2,判断如果所有余数都不为零则该数为素数。
  #endif

 2 #include<stdio.h>
 3 
 4 void su(int low,int high){
 5     int i;
 6     for(i=low;i<=high;i++){
 7         int j;
 8         int st=0;
 9         for(j=2;j<low;j++){
10             if(i%j==0){
11                 st++;
12             }
13             
14         }
15         if(st==0){
16             printf("%d 是素数
",i);
17         }
18         
19         
20     }
21     
22 }
23 int main(){
24     
25     su(100,200);
26     return 0;
27 }


25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。

 1

  #if 0
  25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。

  解题思路:
  一。建立一个五个元素数组,中间三个用于用户输入,首尾元素分别为0 101。
  二。依次遍历数组两两之间,元素值之间不包括本身进行累加,
  三。将最后累加值总和进行输出为结果。
  #endif

 2 #include<stdio.h>
 3 
 4 int Accumulate(int low,int high){
 5     int sum=0;
 6     if((low+1)>=(high)){
 7         return 0;
 8     }
 9     for(++low;low<high;low++){
10         sum+=low;
11     }
12     return sum;
13 }
14 
15 int main(){
16     int a[]={0,100,100,100,101};
17     int i;
18     int sum=0;
19     printf("请输入三个数");
20     scanf("%d %d %d",&a[1],&a[2],&a[3]);
21     for(i=1;i<5;i++){
22         sum+=Accumulate(a[i-1],a[i]);
23         //sum+=Accumulate(0,101);
24     }
25     //sum=Accumulate(0,101);
26     printf("
结果是:%d
",sum);
27     
28     return 0;
29 }

26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;计算输入的数中的偶数的个数、总和、平均值。

 1 #if 0
 2 26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;
 3 计算输入的数中的偶数的个数、总和、平均值。
 4 
 5 解题思路:
 6 1。通过命令行传参获取数据,但数据是字符串形式
 7 2。将字符串形式数据转换为int形式数据,放在一个数组中,便于操作
 8 3。按要求对数据进行操作
 9 
10 #endif
11 
12 
13 #include<stdio.h>
14 #include<stdlib.h>
15 
16 int my_even(int num[],int len){
17     int even=0;
18     int i=0;
19     for(i=0;i<len;i++){
20         if(num[i]%2==0){
21             ++even;
22         }
23         
24     }
25     
26     
27     return even;
28 }
29 int my_sum(int num[],int len){
30     int sum=0;
31     int i=0;
32     for(i=0;i<len;i++){
33         sum+=num[i];
34     }
35     return sum;
36 }
37 
38 int my_ave(int num[],int len){
39     int ave=my_sum(num,len);
40     ave/=len;
41     return ave;
42     
43 }
44 
45 int main(int argc,char *argv[]){
46     int i=0;
47     for(i=1;i<argc;i++){
48         //printf("%s
",argv[i]);
49         if(*argv[i]=='0'){
50             //i;
51             break;
52         }    
53     }
54     //printf("%s",argv[i]);
55     int *num;
56     int len=i-1;
57     if(NULL==(num=(int *)malloc(sizeof(int)*len))){
58         perror("cannot malloc");
59         return 1;
60     }
61     //num[0]=NULL;
62     
63     for(i=0;i<len;i++){
64         int sum=0;
65         char *s=argv[i+1];
66         while(*s !=''){
67             sum=sum*10+((*s++)-'0');
68             //printf("%c",*s);
69             //++s;
70         }
71         num[i]=sum;
72     }
73     /*
74     for(i=0;i<len;i++){
75         printf("%d 
",num[i]);
76     }
77     */
78     int even=my_even(num,len);
79     int sum=my_sum(num,len);
80     int ave=my_ave(num,len);
81     printf("偶数个数:%d,总和:%d,平均值:%d。",even,sum,ave);
82     
83     
84     return 0;
85 }

27、卡拉兹(Callatz)猜想:
对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1?

 1 #if 0
 2 27、卡拉兹(Callatz)猜想:
 3 对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,
 4 最后一定在某一步得到n=1 。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,
 5 拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,
 6 卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
 7 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1 8 解题思路:
 9 1.  获取一个数
10 2.  判断是偶数则除二,是奇数乘三加一
11 3。 循环判断直至得到1;
12 
13 #endif
14 
15 #include<stdio.h>
16 
17 int main(){
18     int num=0;
19     printf("输入一个1000以内的自然数:");
20     scanf("%d",&num);
21     
22     while(num!=1){
23         if(num%2==0){
24             num/=2;
25         }else if(num%2==1){
26             num=num*3+1;
27         }
28         printf("%d	",num);
29     }
30     return 0;
31 }



28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=0;
if(x!=0)
{
if(x>0)
y=1;
else
y=-1;
}
printf("x=%d y=%d ",x,y);
return 0;
}

 1 //28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
 2 #include<stdio.h>
 3 int main()
 4 {
 5     int x,y;
 6     printf("enter x:");
 7     scanf("%d",&x);
 8     y=0;
 9     if(x!=0)
10     {
11         if(x>0)
12         y=1;
13         else
14         y=-1;
15     }
16     printf("x=%d
y=%d
",x,y);
17     return 0;
18 }


29、给定一个不多于5位的正整数,要求:
①求出它是几位数
②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
③将数字逆序。例如输入123,则输出321

 1 #if 0
 2 29、给定一个不多于5位的正整数,要求:
 3 ①求出它是几位数
 4 ②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
 5 ③将数字逆序。例如输入123,则输出321

  解题思路:
  一。对输入数值合法性进行判定
  二。判断数据的位数。
  三。提取按从高位到低位进行,但将提取的数据按从低位到高位累加可得置逆结果。


  错误分析:
  本例中应该用一个数组存储提取的每一位的值。

 6 #endif
 7 
 8 #include<stdio.h>
 9 #include<math.h>
10 
11 int main(){
12     int num;
13     int Q=10000;
14     int wei=0;
15     int ni=0;
16     printf("输入不大于十万的数");
17     scanf("%d",&num);
18     if(num>99999){
19         printf("数据过大");
20         return 0;
21     }
22     while(num/Q==0){
23         Q=Q/10;
24         
25     }
26     while(Q>0){
27         int a=num/Q;
28         Q=Q/10;
29         a=a%10;
30         
31         printf("第%d位是:%d
",wei+1,a);
32         ni=ni+pow(10,wei)*a;
33         wei++;
34     }
35     printf("
置逆%d
",ni);
36     
37     
38     
39     
40     return 0;
41 }


30、使用公式求π的近似值
π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
直到某一项的绝对值小于10^-6为止。
(提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
若要使用fabs()函数,则应包含头文件math.h
#include<math.h>
而且要在编译时添加-lm,即手动添加数学库libm.o
gcc qiupai.c -o qiupai -lm)

 1 #if 0
 2 30、使用公式求π的近似值
 3 π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
 4 直到某一项的绝对值小于10^-6为止。
 5 (提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
 6 fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
 7 若要使用fabs()函数,则应包含头文件math.h
 8 #include<math.h>
 9 而且要在编译时添加-lm,即手动添加数学库libm.o
10 gcc qiupai.c -o qiupai -lm)
11 
12 解题思路:
13 一。使用累加结束条件为某一项的绝对值小于10^-6为止。
14 二。每一项中加减交替,分子为1,分母为奇数递增。
15 三。累加结果乘四为π的值
16 
17 错误经历:
18 将double型的数据以%d形式输出;
19 
20 #endif
21 
22 #include<stdio.h>
23 #include<math.h>
24 
25 int main(){
26     double PI;
27     double sum=1;
28     double item=0;
29     int i=1;
30     double jue=1;
31     //int fp=1;
32     while(fabs(jue)>=1e-6){
33         if(i>0){
34             i+=2;
35         }else{
36             i-=2;
37         }
38         i=-i;
39         item=(double)1/i;
40         
41         sum+=item;
42         //printf("item=%lf
",sum);
43         
44         jue=item;
45         if(jue<0){
46             jue=-jue;
47         }
48         
49         
50         //fp++;
51         /*
52         if(fp>1000){
53             break;
54         }
55         */
56         
57     }
58     PI=sum*4;
59     printf("π=%lf ",PI);
60     
61     return 0;
62 }

原文地址:https://www.cnblogs.com/lanbofei/p/9440740.html