任务1

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

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 14_47_59

1.根据分数十位数判断等第

2.由于穿透效应,导致60及以上全是D,不及格为E。

任务2

 1  #include <stdio.h>
 2  int sum_digits(int n);  // 函数声明
 3 int main() {
 4     int n;
 5     int ans;
 6     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
 7         ans = sum_digits(n);    // 函数调用
 8         printf("n = %d, ans = %d\n\n", n, ans);
 9     }
10     return 0;
11  }
12  // 函数定义
13 int sum_digits(int n) {
14     int ans = 0;
15     while(n != 0) {
16         ans += n % 10;
17         n /= 10;
18     }
19     return ans;
20  }

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 14_54_44

1.求出各数位总和

2.可以。原题是循环迭代,改版是递归。时间复杂度都为O(logn)

任务3

 1 int power(int x, int n);    // 函数声明
 2 int main() {
 3     int x, n;
 4     int ans;
 5     while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
 6         ans = power(x, n);  // 函数调用
 7         printf("n = %d, ans = %d\n\n", n, ans);
 8     }
 9     
10     return 0;
11  }
12  // 函数定义
13 int power(int x, int n) {
14     int t;
15     if(n == 0)
16         return 1;
17     else if(n % 2)
18         return x * power(x, n-1);
19     else {
20         t = power(x, n/2);
21         return t*t;
22     }
23  }

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 15_01_15

1.求x^n,    n>=0

2.是的。

x^n=      1 ,n==0;  x*x^(n-1),n>0 is odd;  x^(n/2)*x^(n/2),n>0 is even.

二分法思想减少运算中间值

任务4

 1 #include <stdio.h>
 2 using namespace std;
 3 bool is_prime(int p){
 4     int e=2;
 5     if(p==1) return 0;
 6     if(p%e==0&&p!=2)
 7         return 0;
 8     e=3;        
 9     for(;;){
10         if(p%e==0) return 0;
11         e+=2;
12         if(e*e>p) return 1;    
13     }
14 }
15 int main(){
16     
17 //    int i=2;
18 //    scanf("%d",&i);
19 //    printf("\n%d",(int)is_prime(i));
20 
21 //    if(is_prime(i+2))printf("%d %d",i,i+2);
22 //    i++;
23     printf("100以内的孪生素数\n");
24     //2是唯一的偶素数,排除。 
25     int i=3,cnt=0;
26     //判断下一个奇数是不是素数 (
27     for(;;){
28         for(;;){//
29             if(i+2>100)break;//
30             if(is_prime(i+2)){//
31                 printf("%d %d\n",i,i+2);//
32                 cnt++;//
33                 i+=2;    //
34             }else{//
35                 i+=2;//
36                 break;//
37             }//
38         }//这个是为连续孪生素奇数准备的,作用不大,省一丢丢重复判断 
39         if(i+2>100)break;
40         for(;;){
41             if(is_prime(i+2)){
42                 i+=2;
43                 break;
44             }else{
45                 i+=2;
46             }
47         } 
48     }
49     printf("100以内的孪生素数共有%d对",cnt);
50     return 0;
51 }

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 15_59_41

任务5

 1  #include <stdio.h>
 2  int func(int n, int m);   // 函数声明
 3 int main() {
 4     int n, m;
 5     int ans;
 6     while(scanf("%d%d", &n, &m) != EOF) {
 7         ans = func(n, m);   // 函数调用
 8         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
 9     }
10     return 0;
11 }
12 int func(int n,int m){
13     if(m>n) return 0;
14     //先由数学知识,尝试将m变小
15     m=(m<n-m?m:n-m);
16     int um=1,dm=1;
17     for(int i=1;i<=m;i++){
18         um*=(n+1-i);
19         dm*=i;    
20     }
21     return um/dm;
22      
23 }
24     

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 16_36_33

这是迭代法,下面是递归:

 1  #include <stdio.h>
 2  int func(int n, int m);   // 函数声明
 3 int main() {
 4     int n, m;
 5     int ans;
 6     while(scanf("%d%d", &n, &m) != EOF) {
 7         ans = func(n, m);   // 函数调用
 8         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
 9     }
10     return 0;
11 }
12 int memo[100][100];
13 int func(int n,int m){
14     if(m>n) return 0;
15     if(m==0||m==n) return memo[n][m]=1;
16     return (memo[n][m]?memo[n][m]:func(n-1,m-1)+func(n-1,m));//我采用了记忆化递归防止重复运算 
17 }

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 16_48_29

;)

任务6

 1  #include <stdio.h>
 2  // 函数声明
 3 // 待补足....
 4 int gcd(int a,int b,int c);
 5  int main() {
 6     int a, b, c;
 7     int ans;
 8     while(scanf("%d%d%d", &a, &b, &c) != EOF) {
 9         ans = gcd(a, b, c);     // 函数调用
10         printf("最大公约数: %d\n\n", ans);
11     }
12     return 0;
13  }    
14  int gcd(int a,int b,int c){
15      int ans=1;
16      for(int i=1;i<=a&&i<=b&&i<=c;i++){
17          if(a%i==0&&b%i==0&&c%i==0)ans=i;
18      }
19      return ans;
20  }
21      

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 17_02_42

任务7

 1  #include <stdio.h>
 2  #include <stdlib.h>
 3  // 函数声明
 4 // 待补足
 5 // xxx
 6 void print_charman(int n);
 7  int main() {
 8     int n;
 9     printf("Enter n: ");
10     scanf("%d", &n);
11     print_charman(n); // 函数调用
12        
13     return 0;
14  }
15  void print_charman(int n){
16      for(int i=1;i<=n;i++){
17          for(int j=1;j<=i-1;j++){
18              printf("\t");
19          }
20          for(int j=1;j<=2*n-2*i+1;j++){
21              printf(" O \t");
22          }
23          printf("\n");
24          for(int j=1;j<=i-1;j++){
25              printf("\t");
26          }
27          for(int j=1;j<=2*n-2*i+1;j++){
28              printf("<H>\t");
29          }
30          printf("\n");
31          for(int j=1;j<=i-1;j++){
32              printf("\t");
33          }
34          for(int j=1;j<=2*n-2*i+1;j++){
35              printf("I I\t");
36          }
37          printf("\n");
38      }
39  }

C__Users_johnwzq_Documents_实验3.exe 2025_10_31 17_25_13