韩信点兵
来源:互联网 发布:sql数据库设置 编辑:程序博客网 时间:2024/05/21 07:49
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。输入到文件结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
41
No answer
本来我也是循环出答案,四处查阅资料后发现此类题目的正解为
中国剩余定理,这种方法更具有一般性,若数据量增大循环的解
法有明显的劣势,利用中国剩余定理则可以降低复杂度。当然我
写的代码还有带优化之处,比如求a1, a2, a3时我利用了循环求
解,此方法不妥当,我也看到有些大牛给出了更为简洁的代码,
一时为看懂就未贴出来。若代码中有错误还请及时指出。
//第一种解决方法#include <iostream>#include <time.h>using namespace std;int main(){ int a, b, c; while(cin>>a>>b>>c) { for (int sum = 10; sum <= 100; sum++) { if (sum % 3 == a && sum % 5 == b && sum % 7 == c) { cout<<sum<<endl; break; } if(sum == 100) { cout<<"No answer\n"<<endl; } } } return 0;}
第二种方法用中国剩余定理
#include <iostream>using namespace std;int a1 = 0, b1 = 0, c1 = 0;const int a = 3, b = 5, c = 7;void getPara(){ for (int i = 1; ; i++) { if (i * b * c % a == 1) { a1 = i * b * c; //cout<<a1<<endl; break; } } for (int i = 1; ; i++) { if (i * a * c % b == 1) { b1 = i * a * c; //cout<<b1<<endl; break; } } for (int i = 1; ; i++) { if (i * b * a % c == 1) { c1 = i * b * a; //cout<<c1<<endl; break; } }}int main(){ int mod1, mod2, mod3; getPara(); while(cin>>mod1>>mod2>>mod3) { int answer = (a1 * mod1 + b1 * mod2 + c1 * mod3)%(a* b * c); int i = 1; if (answer < 10 || answer > 100) { cout<<"Case "<<i<<": No answer"<<endl; } else { cout<<"Case "<<i<<": "<<answer<<endl; } i++; } return 0;}
相关资料阅读:
http://blog.csdn.net/u013068502/article/details/38139799
http://www.cnblogs.com/mengfanrong/p/5186838.html
1 0
- //韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 安卓崩溃信息收集框架ACRA
- SurfaceView与View的区别和使用场景
- 一个简单的html5Demo
- textarea文本域及高度自适应
- OD常见断点和破解思路
- 韩信点兵
- 【GLSL教程】(一)图形流水线
- Android图片缓存之Bitmap详解
- 移动支付批量制卡系统架构
- 请减少使用@SuppressLint("NewApi")
- 抓包工具Fiddler的使用教程(九):本地文件替换服务器文件
- 网站制作前需知
- React Native 升级策略 简述
- [class^="icon_"]、[class*=" icon_"]是什么意思