实验三
实验任务1
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 char score_to_grade(int score); // 函数声明 6 7 int main() { 8 int score; 9 char grade; 10 11 while (scanf("%d", &score) != EOF) { 12 grade = score_to_grade(score); // 函数调用 13 printf("分数: %d, 等级: %c\n\n", score, grade); 14 } 15 system("pause"); 16 return 0; 17 } 18 19 // 函数定义 20 char score_to_grade(int score) { 21 char ans; 22 23 switch (score / 10) { 24 case 10: 25 case 9: ans = 'A'; break; 26 case 8: ans = 'B'; break; 27 case 7: ans = 'C'; break; 28 case 6: ans = 'D'; break; 29 default: ans = 'E'; 30 } 31 32 return ans; 33 }
截图:
问题1:函数功能是将输入的分数转化为对应的字符等级,形参类型是int整型,返回值类型为char字符型
问题2:switch语句缺少break,使每个分支运行后会跳转到下一个分支而不是跳出选择,依次输出所有选项
实验任务2
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int sum_digits(int n); // 函数声明 6 7 int main() { 8 int n; 9 int ans; 10 11 while (printf("Enter n: "), scanf("%d", &n) != EOF) { 12 ans = sum_digits(n); // 函数调用 13 printf("n = %d, ans = %d\n\n", n, ans); 14 } 15 16 return 0; 17 } 18 19 // 函数定义 20 int sum_digits(int n) { 21 int ans = 0; 22 23 while (n != 0) { 24 ans += n % 10; 25 n /= 10; 26 } 27 28 return ans; 29 }
截图:
问题1:函数通过循环除以10取余得到每位数的数值并累加到ans
问题2:也可以,原本是循环先取余获得位数再相加,后者是判断先计算末尾再截取循环
实验任务3:
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int power(int x, int n); // 函数声明 6 7 int main() { 8 int x, n; 9 int ans; 10 11 while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 12 ans = power(x, n); // 函数调用 13 printf("n = %d, ans = %d\n\n", n, ans); 14 } 15 16 return 0; 17 } 18 19 // 函数定义 20 int power(int x, int n) { 21 int t; 22 23 if (n == 0) 24 return 1; 25 else if (n % 2) 26 return x * power(x, n - 1); 27 else { 28 t = power(x, n / 2); 29 return t * t; 30 } 31 }
截图:
问题1:函数是用于以第一个数为底,第二个数为幂的指数运算,同时定义幂指数为0时输出1
问题2:是,公式如下:
power(x,n)=1,n=0
power(x,n)=x Xpower(x,n-1),n为奇数
power(x,n)=power(x,n-1)Xpower(x,n-1),n为不为0的偶数
实验任务4
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int is_prime(int n) { 6 if (n < 2) { 7 return 0; 8 } 9 for (int i = 2; i * i <= n; i++) { 10 if (n % i == 0) { 11 return 0; 12 } 13 } 14 return 1; 15 } 16 17 int main() { 18 int count = 0; 19 printf("100以内的孪生素数:\n"); 20 for (int i = 2; i + 2 <= 100; i++) { 21 if (is_prime(i) && is_prime(i + 2)) { 22 printf("%d, %d\n", i, i + 2); 23 count++; 24 } 25 } 26 printf("100以内的孪生素数共有%d个\n", count); 27 return 0; 28 }
截图:
实验任务5
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int count = 0; 6 void hanoi(int n, char source, char target, char auxiliary) { 7 if (n == 1) { 8 printf("1: %c --> %c\n", source, target); 9 count++; 10 return; 11 } 12 hanoi(n - 1, source, auxiliary, target); 13 printf("%d: %c --> %c\n", n, source, target); 14 count++; 15 hanoi(n - 1, auxiliary, target, source); 16 } 17 int main() { 18 int n; 19 while (scanf("%d", &n) != EOF) { 20 count = 0; 21 hanoi(n, 'A', 'C', 'B'); 22 printf("\n一共移动了%d次.\n\n", count); 23 } 24 return 0; 25 }
截图:
实验任务6
代码(1):

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int func(int n, int m); // 函数声明 6 7 int main() { 8 int n, m; 9 int ans; 10 11 while(scanf("%d%d", &n, &m) != EOF) { 12 ans = func(n, m); // 函数调用 13 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 14 } 15 16 return 0; 17 } 18 19 // 迭代方式计算组合数 20 int func(int n, int m) { 21 if (m > n) return 0; 22 if (m == 0 || m == n) return 1; 23 int result = 1; 24 for (int i = 1; i <= m; i++) { 25 result *= (n - (m - i)); 26 result /= i; 27 } 28 return result; 29 }
代码(2):

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int func(int n, int m); // 函数声明 6 7 int main() { 8 int n, m; 9 int ans; 10 11 while(scanf("%d%d", &n, &m) != EOF) { 12 ans = func(n, m); // 函数调用 13 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 14 } 15 16 return 0; 17 } 18 19 // 递归方式计算组合数 20 int func(int n, int m) { 21 if (m > n) return 0; 22 if (m == 0 || m == n) return 1; 23 return func(n - 1, m) + func(n - 1, m - 1); 24 }
截图:
实验任务7
代码:

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 4 // 函数声明 5 int gcd(int a, int b, int c); 6 7 int main() { 8 int a, b, c; 9 int ans; 10 11 while (scanf("%d%d%d", &a, &b, &c) != EOF) { 12 ans = gcd(a, b, c); // 函数调用 13 printf("最大公约数: %d\n\n", ans); 14 } 15 16 return 0; 17 } 18 19 20 // 函数定义 21 int gcd(int a, int b, int c) { 22 int min = a; 23 if (b < min)min = b; 24 if (c < min)min = c; 25 26 for (int i = min; i >= 1; i--) { 27 if (a % i == 0 && b % i == 0 && c % i == 0) { 28 return i; 29 } 30 } 31 return 1; 32 }
截图: