算法竞赛入门经典(第二版)课后习题 第二章 答案

大二暑假计划进行算法学习,希望自己能把这本紫宝书看完,同时通过写博客来督促自己按时完成任务QAQ

以下是第二章课后习题答案,完成后拿出来供小伙伴参考交流

以下所有代码均用C语言完成

2-1 水仙花数

2-2 韩信点兵

2-3 倒三角形

2-4 子序列的和

2-5 分数化小数

2-6 排列

思考


2-1 水仙花数

//水仙花数
#include <stdio.h>
int main(){
    int a,b,c;
    for(int i=100;i<=999;i++){
        a=i/100;
        b=i/10%10;
        c=i%10;
        if(a*a*a+b*b*b+c*c*c==i)
            printf("%d ",i);
    }
    return 0;
}

2-2 韩信点兵

//韩信点兵
#include "stdio.h"
int main(){
    int a,b,c,count=1;
    while(scanf("%d %d %d",&a,&b,&c)==3){
        for(int i=10;i<=100;i++){
            if(i%3==a && i%5==b && i%7==c){
                printf("Case%d:%d\n",count,i);
                break;
            }
            if(i==100)
                printf("Case%d:No answer",count);
        }
    }
    return 0;
}


2-3 倒三角形

//倒三角
#include "stdio.h"
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int num1=i;
        int num2=2*(n-i)-1;
        while(num1--){     //0 1 2 3 4 5
            printf("%s"," ");
        }
        while(num2--){     //9 7 5 3
            printf("%s","*");
        }
        printf("\n");
    }
    return 0;
}


2-4 子序列的和

//子序列的和
#include <stdio.h>
int main(){
    int n,m;
    while(scanf("%d %d",&n,&m)==2){
        if(n==0 && m==0) break;
        double sum=0;
        int count=1;
        for(int i=n;i<=m;i++){
            //sum+=1.0/(i*i);  陷阱在此
            sum+=(1.0/i)*(1.0/i);
        }
        count++;
        printf("Case%d: %.5f\n",count,sum);
    }
    return 0;
}


2-5 分数化小数

//分数化小数
#include <stdio.h>
int main(){
    int a,b,c,count=1;
    while(scanf("%d%d%d",&a,&b,&c)==3){
        if(a==0 && b==0 && c==0) break;
        printf("Case %d:%.*f\n",count,c,(double)a/b);
        count++;

    }
    return 0;
}


2-6排列

//排列
#include "stdio.h"
int main(){
    //i的范围为111到333之间
    for(int i=111;i<=333;i++){
        int s[10];
        for(int j=0;j<10;j++)
            s[j]=0;
        int a=i,b=2*i,c=3*i;
        s[a/100]=1;
        s[a/10%10]=1;
        s[a%10]=1;

        s[b/100]=1;
        s[b/10%10]=1;
        s[b%10]=1;

        s[c/100]=1;
        s[c/10%10]=1;
        s[c%10]=1;
        int sum=0;
        for(int j=1;j<10;j++)
            sum+=s[j];
        if(sum==9)
            printf("%d %d %d\n",a,b,c);

    }
    return 0;
}


思考

在这里插入代码片


版权声明:本文为weixin_46044901原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。