有一队士兵,确切人数不知,但若每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