• 算法竞赛第二章——习题思路总结


    习题2-1 水仙花数

    三位数ABC,范围在100~999,这个三位数满足ABC = A^3 + B^3 + C^3,则称为是水仙花数。

    解题思路:
    百位、十位、个位分别遍历,判断满足ABC = A^3 + B^3 + C^3则为水仙花数
    
    关键代码:
    for(int i = 1; i < 10; i++)
        for(int j = 0; j < 10; j++)
            for(int k = 0; k < 10; k++)
            {
                    num = i*100 + j*10 + k;
                    if(num == int((pow(i, 3) + pow(j, 3) + pow(k, 3))))
                        printf("%d	", num);
                }
    

    习题2-2 韩信点兵

    要求总人数,只需要将人数分别按3人一排,5人一排,7人一排地排队,每一次看一眼队尾的人数(也就是不能成为一排的人数,即余数),就知道总人数。

    给定每种队形排尾的人数a,b,c,求出总人数最小值。(总人数不小于10,不大于100)

    解题思路:
    依旧是暴力破解,遍历总人数从10到100,总人数满足 i%3==a && i%5==b && i%7==c
    
    关键代码:
    for(int i=10; i <= 100; i++)
        {
            if(i%3==a && i%5==b && i%7==c)
            {
                printf("%d
    ", i);
                break;
            }
            if(i==100) printf("No answer
    ");
        }
    

    习题2-3 倒三角形triangle

    输入正整数n<=20, 输出n层的倒三角形。例n=5:(实际#号间没有空格)

    # # # # # # # # #
     # # # # # # # #
      # # # # # # #
       # # # # # #
        # # # # #
         # # # #
          # # #
           # #
            #
    
    解题思路:
    for(int i=0; i < line; i++)
        {
            for(int j=i;j >0; j-- ) //用来控制每一行前面的空格,随着函数依次增加
            {
                printf(" ");
            }
            
            for(int k=0; k < 2*(line-i) - 1; k++) //用来控制打印"#"的个数
            {
                printf("#");
            }
            
            printf("
    ");
        }
    

    习题2-4 子序列的和(subsequence)

    输入两个正整数,输出 1/n^2 + 1/(n+1)^2 + 1/m^2

    关键代码:
    for(; n<= m; n++)
        {
            S += 1.0/(n*n); 
        }
        printf("%.5f
    ", S);
    

    习题2-5 分数化小数

    输入整数a,b,c,输出a/b的小数形式,精确到小数点后c位。

    解题思路:
    由于自带的浮点运算,算不出指定的小数点后位数。采用计算机去模拟手算的过程。注意最后一位需要根据再往后一位进行四舍五入
    
    while(scanf("%d%d%d", &a, &b, &c) == 3) //scanf返回成功输入的变量个数
        {
            //if(a && b && c) break;
            kase++;
            //先输出小数点前的数字
            printf("case:%d:%d.", kase, a/b);
    
            a %= b;
            //输出小数点后的c-1位
            for(i=1;i<c;i++)
            {
                printf("%d", a*10/b); //注意是没有换行符的
                a = a*10%b;
            }
            
            //最后一位,四舍五入处理
            if(a*10%b*10/b >= 5) //c+1为数据【判断,若大于等于5
                printf("%d
    ", a*10/b+1);
            else
                printf("%d
    ", a*10/b);
    
        }
    

    习题2-6 排列(permutation)

    用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出满足要求的abc:def:ghi。

    int s[10]; //定义一个数组记录1-9出现的次数
        for(int i=123; i < 333; i++)
        {
            for(int m=0; m<10; m++)
            {
                s[m] = 0;
            }
            
            i = i*1; //1倍的数
            //分离各位数,用于最后判断每一个数字是否恰好用了一次
            s[i/100]   = 1;
            s[i/10%10] = 1;
            s[i%10]    = 1;
    
            int j = i*2; //2倍的数
            s[j/100]   = 1;
            s[j/10%10] = 1;
            s[j%10]    = 1;
    
            int k = i*3; //3倍的数
            s[k/100]   = 1;
            s[k/10%10] = 1;
            s[k%10]    = 1;
    
            int sum=0;
            for(int m=1; m < 10; m++)
                sum += s[m];
            //等于9,则说明每一个数字都出现一次
            if(sum==9)  printf("%d %d %d
    ", i, j, k);
        }
    
  • 相关阅读:
    正则判断是否为纯数值
    前后端加密解密crypto.js
    小程序使用iconfont字体图标
    LeetCode-Combination Sum II
    LeetCode-Combination Sum
    Google 2013 campus test-R1
    Google Codejam
    LeetCode-Count and Say
    LeetCode-Binary Tree Level Order Traversal II
    LeetCode-Binary Tree Level Order Traversal
  • 原文地址:https://www.cnblogs.com/wemo/p/10389470.html
Copyright © 2020-2023  润新知