实验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 问题答案

 
  1. switch 表达式类型:整型或字符型
  2. case 后必须是:常量表达式
  3. break 作用:跳出 switch 结构,防止穿透
  4. 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;
}

image

 

任务 2 问题答案

 
  1. 迭代与递归区别:迭代用循环,效率高;递归调用自身,代码简洁但有栈开销
  2. 递归出口:n == 0 时返回 0
  3. n%10 作用:取出数字的个位
  4. 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 问题答案

    1. 快速幂思想:分治思想,将幂次折半计算,减少乘法次数
    2. 递归出口:n == 0 时返回 1
    3. 偶数幂处理:xⁿ = (x²)^(n/2)
    4. 奇数幂处理:xⁿ = x * x^(n-1)
    5. #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 组合数(迭代 + 递归)

       

      问题答案

       
      1. 迭代:用循环计算阶乘,再套公式 C (n,m)=n!/(m!(n−m)!)。
      2. 递归:公式 C (n,m)=C (n−1,m)+C (n−1,m−1)。
      3. 递归出口:m=0 或 m=n 时返回 1。
      4. 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

       

posted @ 2026-04-21 23:40  刺客伍六柒(上学ing)  阅读(7)  评论(0)    收藏  举报