基础学习第二

韩信点兵

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。

  • 输出
    输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89

  • 样例输入:
    2 1 6

  • 样例输出:
    Case 1: 41

  • 样例输入:
    2 1 3

  • 样例输出:
    Case 2: No Answer

单纯从题目意思上去做

#include
using namespace std;
int main()
{
    int a,b,c;
    int kase=0;
    while(scanf("%d%d%d",&a,&b,&c))
    {
    int i;
    for(i=10;i<=100;i++)
    {
        if(i%3==a&&i%5==b&&i%7==c)
        {
            printf("Case %d:%d\n",++kase,i);
            break;
        }
    }
    //printf("%d",i);
          if(i==101)
            printf("Case %d:No naswer\n",++kase);

    }
    return 0;
}

我国古代学者早就研究过这个问题.例如我国明朝数学家程大位在他著的《算法统宗》(1593年)中就用四句很通俗的口诀暗示了此题的解法:

三人同行七十稀,
五树梅花甘一枝,
七子团圆正半月,
除百零五便得知.

“正半月”暗指15.”除百零五”的原意是,当所得的数比105大时,就105、105地往下减,使之小于105;
这相当于用105去除,求出余数.

这四句口诀暗示的意思是:
当除数分别是3、5、7时,

用70乘以用3除的余数
用21乘以用5除的余数
用15乘以用7除的余数
然后把这三个乘积相加
加得的结果如果比105大,就除以105,所得的余数就是满足题目要求的最小正整数解.
以测试数据 2 3 4 为例:
按这四句口诀暗示的方法计算韩信点的这队士兵的人数可得:

70×2+21×3+15×4=263,
263=2×105+53,

所以,这队士兵至少有53人.
在这种方法里,我们看到:70、21、15这三个数很重要,稍加研究,可以发现它们的特点是:

70是5与7的最倍数,且用3除余1;
21是3与7的倍数,且用5除余1;
15是3与5的倍数,且用7除余1.
因而:
70×2是5与7的倍数,用3除余2;
21×3是3与7的倍数,用5除余3;
15×4是3与5的倍数,用7除余4.
代码如下:

#include

int main()
{
    int a,b,c,m; 
    scanf("%d%d%d",&a,&b,&c);
    m=(a*70+b*21+c*15);
    if(m>105)
     m=m-105; 
     printf("%d\n",m); 
     return 0;
}

上述改良来自:https://blog.csdn.net/anmingyu11/article/details/51836859

你可能感兴趣的:(基础学习第二)