任务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 }

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 }

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 }

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 }

任务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

这是迭代法,下面是递归:
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 }

;)
任务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

任务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 }

浙公网安备 33010602011771号