(C++)“韩信点兵”问题的求解方法

时间:2025-02-09 07:17:27

有一队士兵,确切人数不知,但若每3人一组,则余2人;

每5人一组,余3人;每7人一组,余5人;每11人一组,余4人。

请解答下列问题:

⑴至少有多少人?

⑵若已知人数在5000~10000之间,问有多少个答案?

解:初学者容易想到用逐个试探的方法来求解,

        这样显然很耗时间,特别是在所求解的值非常大时。

求解方法是:逐个满足条件,在寻找满足下一个条件的解时保证前面条件继续成立。

如何做到这一点?

可以这样实现:探索满足下一个条件的n的值时,

    以累加前面各数的最小公倍数来试探。

        由此得到求解的程序段。

#include <iostream>
using namespace std;
 
int main(int argc, char** argv) {
	int n = 2;
	// 满足 3人一组余2
	while(n%5!=3) n+=3;
	// 在保证 3人一组余2的前提下寻找满足5人一组余3的n值
	while(n%7!=5) n+=15;
	//在满足前两个条件的前提下寻找满足7人一组余5的n值
	while(n%11!=4) n+=105;
	//在满足前三个条件的前提下寻找满足11人一组余4的n值
	//(1)至此得到第一个满足条件的人数488  
	//下面第二小题范围   逐个输出
	while(n<5000){
		n+=1155;
	} 
	cout<<"所有满足要求的数量如下:"<<endl; 
	//达到范围要求5000~10000
	while(n<10000){
		cout<<n<<endl;
		n+=1155;
	} 	
}

所有满足要求的数量如下:
5108
6263
7418
8573
9728

--------------------------------
Process exited after 0.1292 seconds with return value 0

另外可以用中国剩余定理求解:

中国剩余定理详解: /p/152226583