韩信点兵算法
2015-07-15 10:35
357 查看
韩信点兵是一个有趣的猜数游戏。如果你随便拿一把蚕豆(数目约在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; int i = 0; while(scanf("%d %d %d", &a, &b, &c) == 3) { if(a >=3 || b >=5 || c >= 7) break; i++; int temp; temp = a*70 + b*21 + c*15; while(temp > 105) temp -= 105; if(temp <= 10 || temp >=100) cout << "Case i: " << "No answer" << endl; else cout << "Case i: " << temp << endl; } return 0; }
相关文章推荐
- 编码顺序、frame_num和POC
- 用界面读取图片并且保存图片的方法
- 主席树(可持久化线段树) 静态第k大
- git subtree
- Spring hibernate 事务的流程
- hive学习之WordCount单词统计
- 修改linux文件权限命令:chmod 【转载】
- NTFS For Mac轻松解决使用难题教程
- HDU 1312 Red and Black-dfs&bfs-(分块)
- Unity二维码识别和生成二维码
- java EE复习之jsp的原理
- ExtJS2.2 form表单提交时不提交emptyText
- iOS 倒计时方法
- Android 编程下的计时器
- VB添加滚轮支持
- hdu1060 N^N首位 log10
- Android 应用内多进程实现
- tcp相关知识
- char*,const char*和string的相互转换
- android创建optionsmenu的方法