天天看點

算法競賽入門經典第二版-第二章習題

2-1

輸出100~999中的所有水仙花數。若3位數ABC滿足ABC=A3+B3+C3,則稱其為水仙花

數。例如153=13+53+33,是以153是水仙花數。

#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(i==a*a*a+b*b*b+c*c*c)      
printf("%d\n",i);      
}      
return 0;      
}      

2-2 

#include <stdio.h>      
/*相傳韓信才智過人,從不直接清點自己軍隊的人數,隻要讓士兵先後以三人一排、五人      
一排、七人一排地變換隊形,而他每次隻掠一眼隊伍的排尾就知道總人數了。輸入包含多組      
資料,每組資料包含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*/      
int main()      
{      
int i,a,b,c;      
scanf("%d%d%d\n",&a,&b,&c);      
for(i=10;i<=100;i++){      
if(i%3==a&&i%5==b&&i%7==c)      
printf("%d\n",i);      
}      
if(i==100)      
printf("No answer");      
return 0;      
}      

2-3

#include <stdio.h>      
/*輸入正整數n≤20,輸出一個n層的倒三角形。例如,n=5時輸出如下:      
#########      
#######      
#####      
###      
#*/      
int main()      
{      
int n;      
scanf("%d",&n);      
for(int i=n;i>=1;i--){ //n層      
for(int j=n;j>i;j--) // 輸出每一行的空格數      
printf(" ");      
for(int k=0;k<2*i-1;k++)//輸出每一行的#數等于2*i-1      
printf("#");      
printf("\n");      
}      
return 0;      
}      

C++:

for (i = n; i > ; i--) {

for (j = ; j < n - i; j++) cout << " ";

for (j = ; j < *i-; j++) cout << "#";

cout << "\n"; }

2-4

#include <stdio.h>      
//注:陷阱就是在n特别大時如果直接n*n就會溢出,是以隻能連除兩次      
int main()      
{      
int n,m;      
scanf("%d %d",&n,&m);      
double sum=0;      
for(int i=n;i<=m;i++)      
//sum +=1.0/((n+i)*(n+i));      
sum+=1.0/i/i;      
printf("%.5f\n",sum);      
return 0;      
}      

2-5

#include <stdio.h>      
/*輸入正整數a,b,c,輸出a/b的小數形式,精确到小數點後c位。a,b≤106,c≤100。輸      
入包含多組資料,結束标記為a=b=c=0*/      
int main()      
{      
int a,b,c;      
scanf("%d %d %d",&a,&b,&c);      
printf("%.*lf\n",c,(double)a/b);      
return 0;      
}      

2-6

用1,2,3,…,9組成3個三位數abc,def和ghi,每個數字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式輸出所有解,每行一個解。

#include<stdio.h>      
int is_valid_number(int num, int array[])      
{      
int x, y, z;      
x = num / 100;      
y = num / 10 % 10;      
z = num % 10;      
if (x == y || y == z || array[x] || array[y] || array[z]) {      
// Digit used      
return 0;      
}      
array[x] = array[y] = array[z] = 1;      
return 1;      
}      
int main()      
{      
int array[10];      
array[0] = 1;      
for (int checked_num = 123; checked_num < 329; checked_num++ )      
{      
for (int i = 1; i < 10; i++)      
array[i] = 0;      
if (is_valid_number(checked_num, array)      
&& is_valid_number(checked_num*2, array)      
&& is_valid_number(checked_num*3, array))      
{      
printf("%d %d %d\n",checked_num,checked_num*2,checked_num*3);      
}      
}      
return 0;      
}