韩信点兵
来源:互联网 发布:淘宝网店运营策划书 编辑:程序博客网 时间:2024/06/09 18:10
描述
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
2 1 6
41
#include <stdio.h>int main(){ int a,b,c; int sum = 0; scanf("%d %d %d",&a,&b,&c); sum = a*70 + b*21 + c*15; while (sum > 105) { sum = sum - 105; } printf("%d\n",sum); return 0;}
我国古代学者早就研究过这个问题.例如我国明朝数学家程大位在他著的《算法统宗》(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取余数,是为了求合乎题意的最小正整数解.
阅读全文
1 0
- //韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 韩信点兵
- 计算几何模板——凸包
- Codeforces 841 Generous Kefa(模拟)
- Double Queue
- struts2--显示等待页面
- HDU 6154 CaoHaha's staff【找规律】【思维题】【好题】
- 韩信点兵
- 第十九篇:内部排序之四:归并排序和快速排序(含完整源码)
- OFFICE 2016下载与激活
- JAVA开发的23种设计模式之 --- 观察者模式
- BZOJ 2002 分块
- 在Android中全屏显示GIF图片
- 第二十篇:内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 常量
- shell命令