韩信点兵的问题求解方法

问题描述:

一队士兵:人数不知,每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<<" ";

}
}  

性能分析:

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


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值