算法竞赛第二章题目以及解法

scanf的返回值由后面的参数决定

  • 如果a和b都被成功读入,那么scanf的返回值就是2
  • 如果只有a被成功读入,返回值为1
  • 如果a和b都未被成功读入,返回值为0
  • 如果遇到错误或遇到end of file,返回值为EOF

习题2-1 

水仙花数(daffodil) 输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3A3 +B3B3 +C3C3 ,则称其为水仙花数。例如153=1^3+5^3+3^3 ,所以153是水仙花数。

#include<stdio.h>
int main() {
    int m, n;
    while(scanf("%d%d",&m,&n)!=EOF) {
        int count = 0;
        for(int i = m; i <= n; i++) {
            int a = i / 100;
            int b = i / 10 % 10;
            int c = i % 10;
            if(a*a*a + b*b*b + c*c*c == i) {
                if(count == 0) {
                    printf("%d", i);
                } else {
                    printf(" %d", i);
                }
                count++;
            }
        }
        if(count == 0) {
            printf("no");
        }
        printf("\n");
    }
    return 0;
}

习题2-2 

韩信点兵(hanxin) 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。

样例输入: 2 1 6 2 1 3 样例输出:

Case 1: 41 Case 2: No answer 

#include<stdio.h>
#include<math.h>
int main() {
    int a,b,c;
    int time = 1;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF) {
        int ans = 0;
        for(int i=10; i<=100; i++) {
            if((i%3==a)&&(i%5==b)&&(i%7==c)) {
                printf("Case %d:%d\n", time, i);
                ans = 1;
                break;
            }
        }
        if(!ans) {
            printf("Case %d:No answer\n", time);
        }
        time++;
    }

    return 0;
}

习题2-3 倒三角形(triangle)

输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:

#########
 #######
  #####
   ###
    #

#include<stdio.h>
#include<math.h>
int main() {
    int n;
    while(scanf("%d",&n)!=EOF) {
        for(int i=0; i<n; i++) {
            for(int j=0; j<i; j++){
                printf(" ");
            }
            for(int k=0; k<2*(n-i)-1; k++) {
                printf("#");
            }
            printf("\n");
        }
    }
    return 0;
}

习题2-4 子序列的和

输入两个正整数,输出1/n2n2+1/(n+1)2(n+1)2+…+1/m2m2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。

样例输入: 2 4 65536 655360 0 0

样例输出: Case 1: 0.42361 Case 2: 0.00001

#include<stdio.h>
#include<math.h>
int main() {
    long long n,m;
    int count = 0;
    while(scanf("%lld%lld",&n,&m)!=EOF) {
        int num = 1;
        if(n==0 && m==0) {
            break;
        }
        double sum = 0.0;
        for(long long i=n;i<=m; i++) {
            sum += 1.0/(double)(i*i);
        }
        printf("Case %d:%.5lf\n", ++count, sum);
    }
    return 0;
}

习题2-5 分数化小数(decimal) 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤10 6 ,c≤100。

输入包含多组数据,结束标记为a=b=c=0。

样例输入: 1 6 4 0 0 0

样例输出: Case 1: 0.1667 

#include<stdio.h>
#include<math.h>
int main() {
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF) {
        if(a==0 && b==0 && c==0) {
            break;
        }
        printf("%.*f\n",c,a/(b*1.0));//精确到小数点后c位*是动态宽度,假如c==5,那么就是"%.5f\n",保留5个小数
    }
    return 0;
}

习题2-6 排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

#include<stdio.h>
int main() {
    int abc, def, ghi;
    int num[10];

    for(int i=123; i<=329; i++) {
        int count = 0;
        for(int i=1; i<=9; i++) {
            num[i] = 0;
        }

        abc = i;
        def = 2*i;
        ghi = 3*i;

        num[abc/100]++;
        num[abc/10%10]++;
        num[abc%10]++;

        num[def/100]++;
        num[def/10%10]++;
        num[def%10]++;

        num[ghi/100]++;
        num[ghi/10%10]++;
        num[ghi%10]++;

        for(int j = 1; j <= 9; j++) {
            if(num[j] != 0) {
                count++;
            }
        }
        if(count == 9) {
            printf("%d %d %d\n", abc, def, ghi);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/oXunWuQiShi1/article/details/82802663