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<2000:8%折扣 9 2000<=s<3000:10%折扣 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("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight); 22 distance=3000; 23 24 } 25 if(distance>=2000){ 26 freight+=(distance-2000)*price*0.90*weight; 27 printf("\n%d=(%d-2000)*%d*0.9*%d\n",freight,distance,price,weight); 28 distance=2000; 29 30 } 31 if(distance>=1000){ 32 freight+=(distance-1000)*price*0.92*weight; 33 printf("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight); 34 distance=1000; 35 36 } 37 if(distance>=500){ 38 freight+=(distance-500)*price*0.95*weight; 39 printf("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight); 40 distance=500; 41 } 42 if(distance>=250){ 43 freight+=(distance-250)*price*0.95*weight; 44 printf("\n%d=(%d-250)*%d*0.9*%d\n",freight,distance,price,weight); 45 distance=250; 46 47 } 48 if(distance>=0){ 49 freight+=(distance)*price*weight; 50 printf("\n%d=(%d-3000)*%d*%d\n",freight,distance,price,weight); 51 } 52 if(distance<0){ 53 printf("\n%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("\n总价为:%d\n",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("\n%d\n",sum); 13 if(sum==i){ 14 printf("\n%d\n",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\n %d \n",one,two); 15 for(i=3;i<=len;i++){ 16 int temp=two; 17 two+=one; 18 one=temp; 19 printf("%d\n",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("\n"); 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 \n",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 是素数\n",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("\n结果是:%d\n",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\n",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 !='\0'){ 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 \n",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\t",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\ny=%d\n",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\ny=%d\n",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\n",wei+1,a); 32 ni=ni+pow(10,wei)*a; 33 wei++; 34 } 35 printf("\n置逆%d\n",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\n",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 }