zoukankan      html  css  js  c++  java
  • 10-语言入门-10-韩信点兵

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

    输入
    输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

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


    样例输入
    2 1 6
    样例输出
    41
     
     
    代码:
     
    #include <stdio.h>

    int main()
    {
         int a = 0;
         int b = 0;
         int c = 0;
        
         int result = 10;
        
         scanf("%d %d %d",&a,&b,&c);
        
         for(;result<=100;++result)
         {
              if( result % 3 == a &&
                   result % 5 == b &&
                   result % 7 == c)
              {
                   break;
              }                   
         }
        
         if(result >= 10 && result <= 100)
         {
              printf("%d ",result);
         }
         else
         {
              printf("No answer ");
         }
        
         return 0;
    }
     
     
    另外补充知识:
    ===============
    韩信点兵是一个有趣的猜数游戏。如果你随便拿一把蚕豆(数目约在100粒左右),先3粒3粒地数,直到不满3粒时,把余数记下来;第二次再5粒5粒地数,最后把余数记下来;第三次是7粒一数,把余数记下来。然后根据每次的余数,就可以知道你原来拿了多少粒蚕豆了。不信的话,你还可以试验一下。例如,假如3粒一数余1粒,5粒一数余2粒,7粒一数余2粒,那么,原有蚕豆有多少粒呢?

    这类题目看起来是很难计算的,可是我国古时候却流传着一种算法,名称也很多,宋朝周密叫它“鬼谷算”,又名“隔墙算”;杨辉叫它“剪管术”;而比较通行的名称是“韩信点兵”。最初记述这类算法的是一本名叫《孙子算经》的书,后来在宋朝经过数学家秦九韶的推广,又发现了一种算法,叫做“大衍求一术”。这在数学史上是极有名的问题,外国人一般把它称为“中国剩余定理”。至于它的算法,在《孙子算经》上就已经有了说明,而且后来还流传着这么一道歌诀:

    三人同行七十稀,

    五树梅花廿一枝,

    七子团圆正半月,

    除百零五便得知。

    这就是韩信点兵的计算方法,它的意思是:凡是用3个一数剩下的余数,将它用70去乘(因为70是5与7的倍数,而又是以3去除余1的数);5个一数剩下的余数,将它用21去乘(因为21是3与7的倍数,又是以5去除余1的数);7个一数剩下的余数,将它用15去乘(因为15是3与5的倍数,又是以7去除余1的数),将这些数加起来,若超过105,就减掉105,如果剩下来的数目还是比105大,就再减去105,直到得数比105小为止。这样,所得的数就是原来的数了。根据这个道理,你可以很容易地把前面的五个题目列成算式:

    1×70+2×21+2×15-105

    =142-105

    =37

    因此,你可以知道,原来这一堆蚕豆有37粒。
    ============
     
    所以可以根据这个计算方式简化求解过程,不需要数据全部遍历来计算了
     

    #include<iostream>
    using namespace std;
    int main()
    {
         int a,b,c;
         cin>>a>>b>>c;
         int n=(a*70+b*21+c*15)%105;
         if(n>100||n<10) cout<<"No answer"<<endl;
         else cout<<n<<endl;
    }         
     
  • 相关阅读:
    python 类的私有属性和方法 (转载)
    python 子类继承父类__init__(转载)
    python 面向对象(类)--学习笔记
    python 迭代器 生成器
    python 从csv文件插入mysql数据库
    python 异常处理【转载】
    大数据-hadoop学习记录
    重看计算机基础1:数据线、地址线,按字、按字节寻址。
    利用requirejs实现vue的模块化开发
    开发vue但不使用vue-cli和webpack相关注意事项
  • 原文地址:https://www.cnblogs.com/sharpfeng/p/5141215.html
Copyright © 2011-2022 走看看