【_(:з)∠)_咸_(:з)∠)_鱼_(:з)∠)_本_(:з)∠)_鱼_(:з)∠)_】
【知识梳理】


【典型例题】
【第十三题】
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
思路:先拆解,再判断。拆解用取整函数ceil。
1 #include <stdio.h> 2 #include <math.h> 3 4 int main() 5 { 6 for (int i = 100; i < 1000; i++) 7 { 8 int a = ceil(i / 100); 9 int b = ceil((i-a*100) / 10); 10 int c = ceil(i - a * 100-b*10); 11 12 if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) 13 { 14 printf("%d是水仙花数\n",i); 15 } 16 } 17 system("pause>nul"); 18 return 0; 19 }
运行结果:

做题心得:pow,ceil等函数需要引用math.h头文件。
【第十四题】
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
思路:分解质因数用短除法。即从2开始除,取余为整是因数。
1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 0; 6 printf("请输入一个整数:"); 7 scanf_s("%d", &a); 8 printf("\n%d=", a); 9 //因数个数 10 int judge = 1; 11 //存放初值 12 int n = a; 13 14 for (int i = 2; i < n; i++) 15 { 16 for (;a % i == 0;) 17 { 18 printf("%d", i); 19 judge++; 20 if (a / i != 1) 21 { 22 printf("×"); 23 } 24 a = a / i; 25 } 26 } 27 if (judge == 1) 28 { 29 printf("%d", a); 30 } 31 32 33 system("pause>nul"); 34 return 0; 35 }
运行结果:

做题心得:这道题卡了好久在如何决定最后一个因数上面,因为这关系到输不输出✖。其实最后的因数最大的特点就是与被除数相等啦。
【第十五题】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
思路:三个结果需要用两个三目。
1 #include<stdio.h> 2 3 int main() 4 { 5 while (1) 6 { 7 int a = 0; 8 printf("请输入成绩:"); 9 scanf_s("%d", &a); 10 11 a >= 90 ? printf("\n成绩:A") : (a >= 60 ? printf("\n成绩:B") : printf("\n成绩:C")); 12 13 system("pause>nul"); 14 printf("\n\n"); 15 } 16 return 0; 17 }
运行结果:

做题心得:n结果需要n-1个条件三目。
【第十六题】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
思路:先用欧几里得算法求出最大公约数。由两个数的乘积等于这两个数的最大公约数与最小公倍数的积可以算出最小公倍数。
1 #include <stdio.h> 2 3 int main() 4 { 5 int a = 0; 6 int b = 0; 7 printf("请输入两个整数(以空格键隔开,以回车键结束):"); 8 scanf_s("%d %d", &a, &b); 9 //存放初值 10 int m = a; 11 int n = b; 12 while (a % b != 0) 13 { 14 int t = b; 15 b = a % b; 16 a = t; 17 } 18 printf("最大公约数是%d,最小公倍数是%d",b,m*n/b); 19 20 system("pause>nul"); 21 return 0; 22 }
运行结果:

做题心得:这里面其实藏了一个两数互换问题。
【第十七题】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
思路:不同的字符对应不同值域,按照字符值为条件进行判断就可以了。
1 #include<stdio.h> 2 int main() 3 { 4 char c; 5 int letters=0,spaces=0,digits=0,others=0; 6 printf("请输入一些字母:\n"); 7 while((c=getchar())!='\n') 8 { 9 if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) 10 letters++; 11 else if(c>='0'&&c<='9') 12 digits++; 13 else if(c==' ') 14 spaces++; 15 else 16 others++; 17 } 18 printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others); 19 return 0; 20 }
运行结果:

做题心得:原理太简单过程太复杂,所以直接从菜鸟搬运过来了。其他字符要排除换行符,不然默认的enter结束输入也会被getchar吃掉。
【第十八题】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
思路:循环放大十倍,加乘赋值即可。
1 #include <stdio.h> 2 #include <math.h> 3 4 int main() 5 { 6 int a = 0; 7 int i = 0; 8 int s = a; 9 printf("请输入个位数和位数(以空格键隔开,以回车键结束):"); 10 scanf_s("%d %d", &a, &i); 11 //存放上一个s里的最大项 12 int t = 0; 13 for (int j = 0; j < i; j++) 14 { 15 t = t + a * pow(10, j); 16 s = s + t; 17 } 18 printf("\ns=%d", s); 19 20 system("pause>nul"); 21 return 0; 22 }
运行结果:

做题心得:用pow不引math,debug到想死。另外关于局部变量的定义问题遇到了很有意思的问题,如果在局部重复定义同名变量,那函数体内的修改将不会作用到函数外的同名变量,因此千万不要过定义。
浙公网安备 33010602011771号