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(" %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 !='