声明:本文一部分内容转自:https://blog.csdn.net/anmingyu11/article/details/51836859

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

解题思路:

第一个想法是枚举,因为数并不大,枚举是最直接的解决办法。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{int a,b,c,i;int num = 1;while(scanf("%d%d%d",&a,&b,&c) != EOF){for(i = 10; i <= 100; i++){if(i%3 == a && i%5 == b&& i%7 == c)//如果这个数满足条件,则跳出循环,确保是最小的数。break;}if(i > 100)printf("Case %d: No answer\n",num);elseprintf("Case %d: %d\n",num,i);num++;}return 0;
}

然而虽然枚举很好,但是却不够巧妙,经过一番探索,得到下面的最佳方案:

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

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

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

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

具体方法如下:(简单方法)

#include<stdio.h>
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;
}

秦王暗点兵问题和韩信乱点兵问题,都是后人对物不知其数问题的一种故事化.
物不知其数问题出自一千六百年前我国古代数学名著《孙子算经》.原题为:”今有物不知其数,三三数之二,五五数之三,七七数之二,问物几何?”
这道题的意思是:有一批物品,不知道有几件.如果三件三件地数,就会剩下两件;如果五件五件地数,就会剩下三件;如果七件七件地数,也会剩下两件.问:这批物品共有多少件?
变成一个纯粹的数学问题就是:有一个数,用3除余2,用5除余3,用7除余2.求这个数.
这个问题很简单:用3除余2,用7除也余2,所以用3与7的最小公倍数21除也余2,而用21除余2的数我们首先就会想到23;23恰好被5除余3,所以23就是本题的一个答案.
这个问题之所以简单,是由于有被3除和被7除余数相同这个特殊性.如果没有这个特殊性,问题就不那么简单了,也更有趣得多.
我们换一个例子;韩信点一队士兵的人数,三人一组余两人,五人一组余三人,七人一组余四人.问:这队士兵至少有多少人?
这个题目是要求出一个正数,使之用3除余2,用5除余3,用7除余4,而且希望所求出的数尽可能地小.
如果一位同学从来没有接触过这类问题,也能利用试验加分析的办法一步一步地增加条件推出答案.
例如我们从用3除余2这个条件开始.满足这个条件的数是3n+2,其中n是非负整数.
要使3n+2还能满足用5除余3的条件,可以把n分别用1,2,3,…代入来试.当n=1时,3n+2=5,5除以5不用余3,不合题意;当n=2时,3n+2=8,8除以5正好余3,可见8这个数同时满足用3除余2和用5除余3这两个条件.
最后一个条件是用7除余4.8不满足这个条件.我们要在8的基础上得到一个数,使之同时满足三个条件.
为此,我们想到,可以使新数等于8与3和5的一个倍数的和.因为8加上3与5的任何整数倍所得之和除以3仍然余2,除以5仍然余3.于是我们让新数为8+15m,分别把m=1,2,…代进去试验.当试到m=3时,得到8+15m=53,53除以7恰好余4,因而53合乎题目要求.
我国古代学者早就研究过这个问题.例如我国明朝数学家程大位在他著的《算法统宗》(1593年)中就用四句很通俗的口诀暗示了此题的解法:
三人同行七十稀,
五树梅花甘一枝,
七子团圆正半月,
除百零五便得知.
“正半月”暗指15.”除百零五”的原意是,当所得的数比105大时,就105、105地往下减,使之小于105;这相当于用105去除,求出余数.
这四句口诀暗示的意思是:当除数分别是3、5、7时,用70乘以用3除的余数,用21乘以用5除的余数,用15乘以用7除的余数,然后把这三个乘积相加.加得的结果如果比105大,就除以105,所得的余数就是满足题目要求的最小正整数解.
按这四句口诀暗示的方法计算韩信点的这队士兵的人数可得:
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.
如果一个数除以a余数为b,那么给这个数加上a的一个倍数以后再除以a,余数仍然是b.所以,把70×2、21×3与15×4都加起来所得的结果能同时满足”用3除余2、用5除余3、用7除余4”的要求.一般地,
70m+21n+15k (1≤m<3, 1≤n<5,1≤k<7)
能同时满足”用3除余m 、用5除余n 、用7除余k”的要求.除以105取余数,是为了求合乎题意的最小正整数解.
我们已经知道了70、21、15这三个数的性质和用处,那么,是怎么把它们找到的呢?要是换了一个题目,三个除数不再是3、5、7,应该怎样去求出类似的有用的数呢?
为了求出是5与7的倍数而用3除余1的数,我们看看5与7的最小公倍数是否合乎要求.5与7的最小公倍数是5×7=35,35除以3余2,35的2倍除以3余2,35的2倍除以3就能余1了,于是我们得到了”三人同行七十稀”.
为了求出是3与7的倍数而用5除余1的数,我们看看3与7的最小公倍数是否合乎要求.3与7的最小公倍数是3×7=21,21除以5恰好余1,于是我们得到了”五树梅花甘一枝”.
为了求出是3与5的倍数而用7除余1的数,我们看看3与5的最小公倍数是否合乎要求.3与5的最小公倍数是3×5=15,15除以7恰好余1,因而我们得到了”七子团圆正半月”.
3、5、7的最小公倍数是105,所以”除百零五便得知”.
例如:试求一数,使之用4除余3,用5除余2,用7除余5.
我们先求是5与7的倍数而用4除余1的数;5与7的最小公倍数是5×7=35,35除以4余3,3×3除以4余1,因而35×3=105除以4余1,105是5与7的倍数而用4除余1的数.
我们再求4与7的倍数而用5除余1的数;4与7的最小公倍数是4×7=28,28除以5余3,3×7除以5余1,因而28×7=196除余5余1,所以196是4与7的倍数而用5除余1的数.
最后求的是4与5的倍数而用7除余1的数:4与5的最小公倍数是4×5=20,20除以7余6,6×6除以7余1,因而20×6=120除以7余1,所以120是4与5的倍数而用7除余1的数.
利用105、196、120这三个数可以求出符合题目要求的
105×3+196×2+120×5=1307.
由于4、5、7的最小公倍数是4×5×7=140,1307大于140,所以1307不是合乎题目要求的最小的解.用1037除以140得到的余数是47,47是合乎题目的最小的正整数解.
一般地,
105m+196n+120k (1≤m<4,1≤n<5,1≤k<7)
是用4除余m,用5除余n,用7除余k的数(105m+196n+120k)除以140所得的余数是满足上面三个条件的最小的正数.
上面我们是为了写出105m+196n+120k这个一般表达式才求出了105这个特征数.如果只是为了解答我们这个具体的例题,由于5×7=35既是5与7的倍数除以4又余3,就不必求出105再乘以3了.
35+196×2+120×5=1027
就是符合题意的数.
1027=7×140+47,
由此也可以得出符合题意的最小正整数解47.
《算法统宗》中把在以3、5、7为除数”物不知其数”问题中起重要作用的70、21、15这几个特征数用几句口诀表达出来了,我们也可以把在以4、5、7为除数的问题中起重要作用的105、196、120这几个特征数编为口诀.留给读者自己去编吧.
凡是三个除数两两互质的情况,都可以用上面的方法求解.
上面的方法所依据的理论,在中国称之为孙子定理,国外的书籍称之为中国剩余定理.

习题2_2、韩信点兵相关推荐

  1. 关于初学算法,习题2-2 韩信点兵(hanxin)的一些需要谨记的点

    先给出题目:         相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人 一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组 数据,每组 ...

  2. 习题 2-2 韩信点兵 (hanxin)(C语言版)

    **习题描述:**相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组数据,每组数据包含3个非负 ...

  3. [作业]习题2-2 韩信点兵(hanxin)

    输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7) ,输出人数的最小值(或报告无解).已知总人数不小于10,不超过100.输入到文 ...

  4. 习题2-2韩信点兵(hanxin)

    目的:求解队伍人数 要求: 输入:三人一排剩余无队人数,五人一排剩余无队人数,七人一排剩余无队人数,到文件末尾结束 输出:总人数最小值或报告无解,人数有上下限要求[10, 100] 样例输入:2 1 ...

  5. 韩信点兵(hanxin)--算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数(C++实现)

    韩信点兵(hanxin)–算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数. (C++实现 ...

  6. 韩信点兵-中国剩余定理(练习)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=34提交地址 韩信点兵-中国剩余定理. 题目能够用枚举非常easy的做出来,在这里写是为了运用一下刚刚 ...

  7. 一位同学想通过用计算机编程解决韩信点兵,高中信息技术《算法与程序设计模块》练习题...

    新课标高中信息技术<算法与程序设计模块>练习题 一.单选题(每题2分,共40分) 1.四川汶川地震过后,要对各个单位捐款救灾情况进行分组制表,并进行积分排序,一般使用的专业电子处理软件是( ...

  8. 4095: 韩信点兵

    4095: 韩信点兵 Description 韩信点兵.韩信在点兵的时候,为了知道有多少个兵,同时又能保住军事机密,便让士兵排队报数. (1)按从1到5报数,记下最后一个士兵报的数为a (2) 再按从 ...

  9. 实验4-1-5 韩信点兵 (10 分)

    实验4-1-5 韩信点兵 (10 分) 在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳.据说韩信的数学水 ...

  10. 韩信点兵--中国剩余定理

    传说西汉大将韩信,由于比较年轻,开始他的部下对他不很佩服.有一次阅兵时,韩信要求士兵分三路纵队,结果末尾多2人,改成五路纵队,结果末尾多3人,再改成七路纵队,结果又余下2人,后来下级军官向他报告共有士 ...

最新文章

  1. android String.format
  2. MolCLR | 对比学习在分子图表示任务中大有作为
  3. 都是月饼惹的祸 124盒月饼太甜太温柔(结尾有彩蛋)
  4. kubernetes常用对象
  5. LogBack 入门实践
  6. 基于python的性能测试工具–locust
  7. mongodb 索引详解
  8. python socket客户端_python 使用socket模拟tcp客户端和tcp服务器端
  9. 家用千兆路由器哪款好?家用千兆无线路由器推荐TOP10!
  10. SSH免密登陆:Win登陆linux
  11. UVALive - 4487 HDU3234 UVA12232 【带权并查集】 非常好的一道题!!!
  12. JavaScript学习(三)
  13. adobe安装错误代码183
  14. A40i使用笔记:QT使用alsa采集音频pcm信息
  15. 免费阅读正在杀死腾讯阅文?
  16. c# 第32节 类的继承
  17. 一文带你深入理解【Java基础】· 枚举类
  18. Deepin v20安装过程详细步骤
  19. python遗传算法有多慢_python遗传算法的优化过程是什么?
  20. svpwm之先把电机转起来

热门文章

  1. Egret Wing常用快捷键
  2. JavaEE Day14 ServletHTTPRequest
  3. android 记事本上功能,安卓手机上有多功能记事本app吗?
  4. 美团Robust热修复工具使用记录
  5. 正则匹配过滤出微信公众号模板内容
  6. 全球首个CTLA-4抑制剂逸沃在中国上市;全球首个原发性轻链型淀粉样变治疗药物兆珂速在华获批 | 医药健闻...
  7. 【Web】Webhacking.kr旧版第五题
  8. MSP430(CCS工程下)添加printf实现打印功能
  9. 20200720《Flask进阶》——蓝本
  10. LNBP10L_LNB电源和控制电压调节器——科时进商城