0%

紫书第二章习题

习题2-1 水仙花数(daffodil)

输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称其为水仙花 数。例如153=13+53+33,所以153是水仙花数。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main()
{
for(int i = 111; i <= 999; i++)
{
int a = i / 100;
int b = i /10 % 10;
int c = i % 10;
int s = a*a*a + b*b*b + c*c*c;
if(s == i) printf("%d\n", i);
}
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#define LOCAL
int main()
{
#ifdef LOCAL
freopen("data.in","r", stdin);
freopen("data.out", "w", stdout);
#endif
int i,a, b, c;
int kase = 0;
while(scanf("%d %d %d", &a,&b,&c) != EOF)
{
// printf("a = %d b = %d c = %d", a, b, c);
for(i = 10; i<=100; i++)
{
if(i % 3 == a && i % 5 == b && i % 7 == c)
{
if(kase) printf("\n");
printf("Case %d: %d\n", ++kase,i);
break;
}
}
if(i >= 101)
{
if(kase) printf("\n");
printf("Case %d: No answer\n", ++kase);
}
}
return 0;
}

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

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

#########

#######

#####

​ ###

​ #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main()
{
int n,tag = 0;
scanf("%d", &n);
for(int i = n; i > 0; i--)
{
int kase = 2*(i-1)+1;
for(int j = 0; j < tag; j++)
{
printf(" ");
}
//打印空格高级一点的写法
/* for(int k = 0; k < n-i; k++)
{
printf(" ");
}
*/
while(kase)
{
printf("#");
kase--;
}
printf("\n");
tag++;
}
}

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

输入两个正整数n<m<106,输出 ,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define LOCAL
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out","w", stdout);
#endif
int k = 0;
int n, m;
double s;
while(scanf("%d %d", &n, &m) != EOF && n && m)
{
s = 0; //s要清零
for(int i = n; i <= m; i++)
{
//s += (1.0/(i*i)); //乘法溢出
s += (1.0/i/i);
}
if(k) printf("\n");
printf("Case %d: %.5f\n",++k,s);
}
return 0;
}

习题2-5 分数化小数(decimal)

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。输 入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
FILE *fin, *fout;
fin = fopen("data.in","rb");
fout = fopen("data.out","wb");
int a, b, c, kase = 0;
while(fscanf(fin,"%d %d %d",&a, &b, &c) != EOF && a && b && c)
{
double d = (double)a/b;
if(kase) fprintf(fout,"\n");
fprintf(fout,"Case %d: %.*lf\n", ++kase, c, d);
//用%.*lf控制输出长度,小数点后面的*表示输出位数,具体数字来自参数表
}
fclose(fin);
fclose(fout);
return 0;
}

习题2-6 排列(permutation)

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

没有思路