韩信点兵(hanxin)–算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数。
(C++实现)
题:
输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100.输入到文件结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case1: 41
Case2: No answer
话不多说,先看代码:
#include<iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
int main()
{
int a, b, c,i,n,k=1;
do
{
n = -1;
cout << "输入三组数据:" << endl;
cin >> a >> b >> c;
for (i = 10; i <= 100; i++)
if (i % 3 == a && i % 5 == b && i % 7 == c)
{
n = i;
break;
}
if (n < 0)
{
cout << "无解" << endl;
k = 0;
}
else
cout << n << endl;
} while (k == 1);
return 0;
}
思路解析:
本题主要在于对同一个数做判断处理,它需要符合三个条件,同时整除3、5、7之后还是它符合要求。
另外,复杂的是找到符合要求的,先赋值替换掉,可以直接break。如果找不到该值,终止循环,就进行判断n的情况,没有符合的其实n=-1,无解。符何要求的,输出该值就OK。
另外,重要的是对最后一句画的理解,输入到文件结束时为止,等于是一直符合条件的需要一直输出,最后无解的情况才退出程序,这里再加一个do-while循环,添加一个k值进行判断。
程序运行示例如下所示:
新手驾到,多指教!