韩信点兵的问题求解方法

来源:互联网 发布:斗龙战士2玩具淘宝 编辑:程序博客网 时间:2024/06/05 11:45

问题描述:

一队士兵:人数不知,每3个人一组,余两个人;每5人一组,余3个人;每7个人一组,余5个人;每11个人一组,余4个人。

至少多少人?若已知人数为5000-10000 则共有多少个答案?

试探法?代码如下

#include<iostream>
using namespace std;
int main(){
void num();
num();
return 1;
}
//直接试探法求解
void num(){
for(int i=0;i<10000;i++)
{
if(i%3==2&&i%5==3&&i%7==5&&i%11==4)
cout<<i<<" ";
}  
}

显然对于数值大的花费要求不合理,我们选择一个个的条件去求解答案。

代码如下:

#include<iostream>
using namespace std;
int main(){
void num();
num();
return 1;
}
//满足条件求解
void num(){
int n=2;//满足条件一最小解
while(n%5!=3) n+=3;//保证1满足后,满足条件二最小解 2,5,8
while(n%7!=5) n+=15;//保证1,2满足后,满足条件三最小解 23,38,53,68
while(n%11!=4) n+=105;//保证1,2,3满足后,满足条件四的最小解 173,278,383,488
cout<<n<<" ";//输出满足条件的最小解
//当知道人数为5000-10000时
while(n<=10000) {
n+=1155;//保证满足1,2,3,4条件下的所有值
if(n>=5000&&n<=10000) cout<<n<<" ";

}
}  

性能分析:

这种方法需要运算的次数其实很少,根据注释来看,只要几次运算我们就得到了结果,显然是我们符合求解性能的要求。


1 0
原创粉丝点击