实验3
int sum_digits(int n) { int sum = 0; while(n > 0) { sum += n % 10; n /= 10; } return sum; } int main() { int n; scanf("%d", &n); printf("%d\n", sum_digits(n)); system("pause"); return 0; }

任务 1 问题答案
- switch 表达式类型:整型或字符型
- case 后必须是:常量表达式
- break 作用:跳出 switch 结构,防止穿透
- default 作用:处理所有未匹配的情况
int sum_digits(int n) { int sum = 0; while(n > 0) { sum += n % 10; n /= 10; } return sum; } int main() { int n; scanf("%d", &n); printf("%d\n", sum_digits(n)); system("pause"); return 0; }

任务 2 问题答案
- 迭代与递归区别:迭代用循环,效率高;递归调用自身,代码简洁但有栈开销
- 递归出口:n == 0 时返回 0
- n%10 作用:取出数字的个位
- n/10 作用:去掉数字的个位
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> double power(int x,int n) { if(n==0) return 1; if(n%2==0) return power(x*x,n/2); else return x*power(x,n-1); } int main() { int x,n; scanf("%d%d",&x,&n); printf("%.10lf\n",power(x,n)); system("pause"); return 0; }
![image]()
任务 3 问题答案
- 快速幂思想:分治思想,将幂次折半计算,减少乘法次数
- 递归出口:n == 0 时返回 1
- 偶数幂处理:xⁿ = (x²)^(n/2)
- 奇数幂处理:xⁿ = x * x^(n-1)
-
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int classify_triangle(int a, int b, int c) { if(a + b <= c || a + c <= b || b + c <= a) return 0; if(a == b && b == c) return 2; if(a == b || a == c || b == c) return 3; if(a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a) return 4; return 1; } int main() { int a, b, c; while(scanf("%d%d%d", &a, &b, &c) != EOF) { int res = classify_triangle(a, b, c); if(res == 0) printf("不能构成三角形\n"); else if(res == 1) printf("普通三角形\n"); else if(res == 2) printf("等边三角形\n"); else if(res == 3) printf("等腰三角形\n"); else if(res == 4) printf("直角三角形\n"); } system("pause"); return 0; }
![image]()
实验5(迭代版)
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int func(int n, int m) { if (m < 0 || m > n) return 0; int i; long long res = 1; for (i = 1; i <= m; i++) { res = res * (n - m + i) / i; } return (int)res; } int main() { int n, m, ans; while (scanf("%d%d", &n, &m) != EOF) { ans = func(n, m); printf("n=%d,m=%d,ans=%d\n", n, m, ans); } system("pause"); return 0; }
![image]()
(递归
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int func(int n, int m) { if (m == 0 || m == n) return 1; if (m < 0 || m > n) return 0; return func(n - 1, m) + func(n - 1, m - 1); } int main() { int n, m, ans; while (scanf("%d%d", &n, &m) != EOF) { ans = func(n, m); printf("n=%d,m=%d,ans=%d\n", n, m, ans); } system("pause"); return 0; }
![image]()
任务 5 组合数(迭代 + 递归)
问题答案
- 迭代:用循环计算阶乘,再套公式 C (n,m)=n!/(m!(n−m)!)。
- 递归:公式 C (n,m)=C (n−1,m)+C (n−1,m−1)。
- 递归出口:m=0 或 m=n 时返回 1。
- m>n 或 m<0 返回 0,无意义。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int gcd(int a, int b, int c) { int min = a; if (b < min) min = b; if (c < min) min = c; int i; for (i = min; i >= 1; i--) { if (a % i == 0 && b % i == 0 && c % i == 0) return i; } return 1; } int main() { int a, b, c, ans; while (scanf("%d%d%d", &a, &b, &c) != EOF) { ans = gcd(a, b, c); printf("最大公约数:%d\n", ans); } system("pause"); return 0; }
![image]()
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> void print_charman(int n) { int i, j; for (i = n; i >= 1; i--) { for (j = 0; j < n - i; j++) printf(" "); for (j = 0; j < i; j++) printf("<H> "); printf("\n"); for (j = 0; j < n - i; j++) printf(" "); for (j = 0; j < i; j++) printf("II "); printf("\n"); } } int main() { int n; printf("Enter n:"); scanf("%d", &n); print_charman(n); system("pause"); return 0; }
![image]()







浙公网安备 33010602011771号