题目:
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼排尾就知道总人数了。
输入包含多组数据,每组数据包含三个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。
已知总人数不小于10,不超过100,。输入到文件结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1:41
Case 2:No answer
分析:
- 军队人数一定,且在10~100
- 遍历10~100的数,找出符合题意的最小数
- 由题意可以得到以下三个式子
设军队人数为n,
当为三人一排时共有x3列(包含人数不满的那一排)
当为五人一排时共有x5列
当为七人一排时共有x7列
n=3*(x3-1)+a
n=5*(x5-1)+b
n=3*(x7-1)+c
- 观察上面三个式子,结合求模运算的特性,可以得到以下三个式子
(n-a)%30
(n-b)%50
(n-c)%7==0
- 即同时满足以上三个式子的最小数,为所求数
代码:
#include<iostream>
using namespace std;
int main()
{
int y3 = 0, y5 = 0, y7 = 0;
cin >> y3 >> y5 >> y7;
bool T = false;//用于判断是否找到所求数
for (int i = 10; i < 100; i++)
{
if ((i - y3) % 3 == 0 && (i - y5) % 5 == 0 && (i - y7) % 7 == 0)
{
//找到的第一个符合条件的数,就是最小数。
cout << i << endl;
T = false;
//退出循环
break;
}
else
T = true;
}
if (T) cout << "No answer" << endl;
return 0;
}