韩信点兵(C++)

韩信点兵(C++),第1张

韩信点兵(C++)

题目:

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼排尾就知道总人数了。

输入包含多组数据,每组数据包含三个非负整数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. 军队人数一定,且在10~100
  2. 遍历10~100的数,找出符合题意的最小数
  3. 由题意可以得到以下三个式子

设军队人数为n,
当为三人一排时共有x3列(包含人数不满的那一排)
当为五人一排时共有x5列
当为七人一排时共有x7列
n=3*(x3-1)+a
n=5*(x5-1)+b
n=3*(x7-1)+c

  1. 观察上面三个式子,结合求模运算的特性,可以得到以下三个式子

(n-a)%30
(n-b)%5
0
(n-c)%7==0

  1. 即同时满足以上三个式子的最小数,为所求数

代码:

#include
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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5116468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存