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

习题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\t", 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\n", i);
            break;
        }
        if(i==100) printf("No answer\n");
    }

习题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("\n");
    }

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

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

关键代码:
for(; n<= m; n++)
    {
        S += 1.0/(n*n); 
    }
    printf("%.5f\n", 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\n", a*10/b+1);
        else
            printf("%d\n", 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\n", i, j, k);
    }
posted @ 2019-02-16 22:03  wemo  阅读(174)  评论(0编辑  收藏  举报