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

时间:2023-02-26 22:06:57
算法竞赛入门经典第二版课后习题答案

第二章

习题2-1水仙花数

输出100-999中的所有水仙花数。若三位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花数。例如153=1^3+5^3+3^3,所以153是水仙花数。

#include<stdio.h>

int main(){

int i,a,b,c;

for(i=100;i<=999;i++){

a=i/100;

b=(i%100)/10;

c=i%10;

if(i==a*a*a+b*b*b+c*c*c){

printf(“%d”,i);

}

}

return 0;

}

习题2-2 韩信点兵

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

第一种算法(枚举法)

#include<stdio.h>

int main(){

int i=10;

int a,b,c;

scanf("%d%d%d",&a,&b,&c);

while(i<100){

if((i%3==a)&&(i%5==b)&&(i%7==c){

printf("%d",i);

}

}

printf("No answer");

}

第二种算法:

#include<stdio.h>

int main(){

int m;

int a,b,c;

scanf("%d%d%d,&a,&b,&c)

m=(a*70+b*21+c*15);

if(m>105){

m=m%105;

printf("%d",m);

return 0;

}

}

printf("No answer");

}

2-3倒三角形

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

#########

#######

#####

###

#

#include<stdio.h>

int main(){

int n,i,j,k;

scanf("%d",&n);

for(i=1;i<=n;i++){

for(j=1;j<=i;j++){

printf(“ ”);

for(k =i;k<=2*n-i;k++){

printf("#");

}

printf("\n");

}

}

习题2-4 子序列的和

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

代码如下:

#include<stdio.h>

int main(){

int  n,m,temp,ans=0;

while(~scanf("%d%d",&n,&m)){

double sum=0;

if(n>m){temp=n;n=m;m=temp;}

if(n==0&&m==0)break;

for(int i=n;i<=m;i++){

sum=sum+1.0/i/i;;

}

printf("Case %d:%.5f\n",sum);}

return 0;

}

习题2-5分数化小数

输入正整数a,b,c,输出a/b的小数形式。精确到小数点后c位。a,b<=10^6,c<=100.输入包含多组数据,结束标记为a=b=c=0;

代码如下:

#include<stdio.h>

int main(){

int a,b,c;

scanf("%d%d%d",&a,&b,&c);

printf("%*.*f\n",c,(ouble)a/b);

return 0;

}

printf

的特殊用法

:

对于

m.n

的格式可以用如下方法表示

 

    char ch[20]; 

    

printf("%*.*s\n",m,n,ch); 

    

前边的

*

定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数

m

 

种方法的好处是可以在语句之外对参数

m

n

赋值,从而控制输出格式。

 

printf

的特殊用法

:

对于

m.n

的格式可以用如下方法表示

 

    char ch[20]; 

    

printf("%*.*s\n",m,n,ch); 

    

前边的

*

定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数

m

 

种方法的好处是可以在语句之外对参数

m

n

赋值,从而控制输出格式。

 

printf的特殊用法:对于m.n的格式可以用如下方法表示

char ch[20];     printf("%*.*s\n",m,n,ch);      

前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。*表示不确定的变量,可以用变量的值替代。

 这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式.

习题2-6排列(permutaion)

用1,2,3.....,9组成三位数abc,def,ghi,每个数字恰好使用一次,要求 abc:def:ghi=1:2:3.按照“abc def ghi”的格式输出所有解,每行一个解。

代码如下:

#include<stdio.h>
#define FOR(i) for(i=1;i<10;i++)
int main(){
    int a,b,c,d,e,f,g,h,i;
    FOR(a){
        FOR(b){
            FOR(c){
                FOR(d){
                    FOR(e){
                        FOR(f){
                            FOR(g){
                                FOR(h){
                                    FOR(i){
                                        if(2*(a*100+b*10+c)==(d*100+e*10+f)&&3*(a*100+b*10+c)==(g*100+h*10+i)){
                                                if((a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=i)&&(b!=c)&&(b!=d)&&(b!=e)&&(b!=f)&&(b!=g)&&(b!=h)&&(b!=i)&&(c!=d)&&(c!=d)&&(c!=e)&&(c!=f)&&(c!=g)&&(c!=h)&&(c!=i)&&(d!=e)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=i)&&(e!=f)&&(e!=g)&&(e!=h)&&(e!=i)&&(f!=g)&&(f!=h)&&(f!=i)&&(g!=h)&&(g!=i)&&(h!=i)){
                                                    printf("%d\n%d\n%d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }
                                        }