刘汝佳《算法竞赛入门经典(第二版)》第二章习题
目录
习题2-1 水仙花数
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A²+B²+C²,则称其为水仙花数。例如:153=1²+5²+3²,所以153是水仙花数。
解析:只有1000个数,直接暴搜就好了。
#include <cstdio>
int main (void)
{
int first = 1;
for (int i = 100; i < 1000; i++)
{
int c = i%10;
int b = i/10%10;
int a = i/100;
if (a*a*a+b*b*b+c*c*c == i)
{
if (first)
first = 0;
else
printf (" ");
printf ("%d",i);
}
}
return 0;
}
习题2-2 韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解,即输出No answer)。已知总人数不小于10,不超过100.输入到文件结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2:No answer
解析:文件结束标志为EOF,在Windows下为Ctrl+Z+Enter,在Unix/Linux/mac OS(其实后两者都是类Unix)下为Ctrl+D。
因为数不大,可以用最简单的暴搜解决,但更巧妙的方法是用最小公倍数,韩信点兵的问题在明朝就出现了,明朝数学家程大位在他所著的《算法统宗》中就暗示了此题解法:
三人同行七十稀,
五数梅花甘一枝,
七子团圆正半月,
除百零五便得知。
甘一是21,正半月是15,除百零五的意思就是求105的余数。可以发现35是5和7的最小公倍数,21是3和7的最小公倍数,15是3和5的