韩信点兵

来源:互联网 发布: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
原创粉丝点击