task1:
1 #include <stdio.h> 2 3 char score_to_grade(int score); 4 5 int main(){ 6 int score; 7 char grade; 8 while(scanf("%d",&score)!= EOF){ 9 grade = score_to_grade(score); 10 printf("分数:%d, 等级:%c\n\n", score, grade); 11 } 12 13 return 0; 14 } 15 16 char score_to_grade(int score){ 17 char ans; 18 19 switch(score/10){ 20 case 10: 21 case 9: ans = 'A';break; 22 case 8: ans = 'B';break; 23 case 7: ans = 'C';break; 24 case 6: ans = 'D';break; 25 default: ans = 'E'; 26 } 27 28 return ans; 29 }

问题一:将分数转换为对应的等级
问题二:1.会依次执行从case 9到default的所有分支,造成输出结果错误。
2.双引号引用表示字符串(地址),于char类型不相符。
task2:
1 #include <stdio.h> 2 3 int sum_digits(int n); 4 5 int main(){ 6 int n; 7 int ans; 8 9 while(printf("Enter n: "), scanf("%d", &n) != EOF){ 10 ans = sum_digits(n); 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 int sum_digits(int n){ 18 int ans = 0; 19 20 while(n != 0){ 21 ans += n % 10; 22 n /= 10; 23 } 24 25 return ans; 26 }

问题一:计算整数n各位数字之和
问题二:等效。一个是递归算法,另一个是循环算法,但效果是相同的。
task3:
1 #include <stdio.h> 2 3 int power(int x, int n); 4 5 int main(){ 6 int x, n; 7 int ans; 8 9 while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF){ 10 ans = power(x, n); 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 int power(int x, int n){ 18 int t; 19 20 if(n == 0) 21 return 1; 22 else if(n % 2) 23 return x * power(x, n-1); 24 else{ 25 t =power(x, n/2); 26 return t * t; 27 } 28 }

问题一:函数 power 的功能是计算整数 x 的非负整数次幂,即计算 xn(n≥0)。
问题二:
ƒ(w,n)=1 if n = 0;
ƒ(w,n)=w*power(w,n-1) if n = 2k+1(k∈N*);
ƒ(w,n)=[power(w,n/2)]2 if n = 2k(k∈N*);
task4:
#include<stdio.h>
int is_prime(int n);
int main(){
int n;
int count = 0;
printf("100以内的孪生素数: \n");
for(n = 2;n <= 98;n++){
if(is_prime(n) && is_prime(n+2)){
printf("%d %d\n", n, n+2);
count++;
}
}
printf("100以内的孪生素数共有 %d 个\n", count);
return 0;
}
int is_prime(int n){
int i;
if(n <= 1)
return 0;
for(i=2; i * i <= n; i++){
if(n % i == 0)
return 0;
}
return 1;
}

task5:
#include <stdio.h>
int hanoi(int n, char from, char to, char via) {
if (n == 1) {
printf("1: %c --> %c\n", from, to);
return 1;
}
int count = 0;
count += hanoi(n-1, from, via, to);
printf("%d: %c --> %c\n", n, from, to);
count += 1;
count += hanoi(n-1, via, to, from);
return count;
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
printf("");
int total = hanoi(n, 'A', 'C', 'B');
printf("一共移动了%d次\n\n", total);
}
return 0;
}

task6:
迭代方法:
1 #include <stdio.h> 2 3 int func(int n, int m); 4 5 int main(){ 6 int n, m; 7 int ans; 8 9 while(scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m){ 18 int fenzi, fenmu; 19 int i; 20 if(m ==0 || m == n) 21 return 1; 22 if(m > (n - m)) 23 m = n - m; 24 fenzi = 1; 25 for(i=0;i < m;i++){ 26 fenzi *= (n-i); 27 } 28 fenmu = 1; 29 for(i=1;i<=m;i++){ 30 fenmu *= i; 31 } 32 33 return fenzi/fenmu; 34 }
递归方法:
1 #include <stdio.h> 2 3 int func(int n, int m); 4 5 int main(){ 6 int n, m; 7 int ans; 8 9 while(scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m){ 18 if (m == 0 || m == n) 19 return 1; 20 21 if (m > n - m) 22 return func(n, n - m); 23 24 return func(n - 1, m - 1) * n / m; 25 }

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

浙公网安备 33010602011771号