韩信点兵计算公式与代码
问题描述:
淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”。
韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信很快说出人数:1049。
问题重述:
上述问题使用数学语言其实可以描述如下:
假设一个数为X,则1000<X<1100(战死四五百),并且X满足以下等式:
X%3 = 2
X%5 = 4
X%7 = 6
让求X。
问题解法:
其实韩信点兵问题,在古代已经有了解法。《孙子算经》有几句乘法口诀:三人同行七十稀, 五树梅花廿一枝, 七子团圆正半月, 除百零五便得知。

这句话的意思就是用被除数是3的余数(2)与70相乘,被除数是5的余数(4)与21相乘,被除数是7的余数(6)与15相乘,最后如果没在范围之内,就加减若干次105就可以得到答案。

所以算法是这样的:2*70+4*21+6*15=314人
314+105+105+105+105+105+105+105=1049人。

其中105是三个被除数的公倍数,即3*5*7=105,那么70,21,15是怎么来的呢?

现代人们解决这个问题用的是中国剩余定理。定理内容可以上网看到,这里不再多说,直接上公式。

上面算式的70,其实就是先让两个被除数相乘,比如被除数5*7=35,然后检查(35*1)除以剩余的那个被除数3是否余1,如果余1,则记下倍数为1;如果不为1,在检查(35*2)除以3是否余1,如果余1,则记下倍数为2,否则接着增加倍数继续判断。
因此,5*7=35,判断(35*1)%3 == 2 != 1,故判断(35*2)%3 ==1,记下倍数为2,35*2=70。
以此类推,
3*7=21,判断(21*1)%5==1,记下倍数为1,21*1=21。
3*5=15,判断(15*1)%7==1,记下倍数为1,15*1=15。
然后乘上另一项的余数再相加:
70*2+21*4+15*6=314。
最后再求出三个被除数的公倍数:3*5*7=105,通过加若干次105,使结果满足范围。

公式如下:
将题目抽象出来:X在(n,m)之间,并且X满足以下等式:
X%a = i
X%b = j
X%c = k
让求X。

第一步:
先求三个倍数x1,x2,x3,初始值三个数都为1,求出满足以下等式的x1,x2,x3。
(b*c*x1) % a == 1
(a*b*x2) % c == 1
(a*c*x3) % b == 1

第二步:
计算三个等式s1,s2,s3
s1 = (b*c*x1) * i
s2 = (a*b*x2) * k
s3 = (a*c*x3) * j

第三步:
求出三个被除数的公倍数s4
s4 = a*b*c

第四步:
计算s = s1+s2+s3

第五步:
根据X所在的范围(n,m),通过将s加减若干次s4,使s满足n<=s<=m。则最终结果s即为所得。

韩信点兵python代码如下:

print('------------------------韩信点兵------------------------')
print("请输入第一组被除数与余数(用空格隔开):")
a,i = map(int,input().split())
print("请输入第二组被除数与余数(用空格隔开):")
b,j = map(int,input().split())
print("请输入第三组被除数与余数(用空格隔开):")
c,k = map(int,input().split())
print("请输入该数的范围:")
n,m = map(int,input().split())x1=x2=x3 = 1                         #表示倍数
s4 = a*b*c                    #三个被除数的公倍数
s1=s2=s3 = 1                  #每项的结果
t1=t2=t3 = False              #用于判断余数是否为1while True:                   #计算出每一项中的倍数x1,x2,x3t1 = (b*c*x1) % a == 1t2 = (a*b*x2) % c == 1t3 = (a*c*x3) % b == 1if(not t1):x1+=1if(not t2):x2+=1if(not t3):x3+=1if(t1 and t2 and t3):breaks1 = (b*c*x1) * i       #第一项的结果
s2 = (a*b*x2) * k       #第二项的结果
s3 = (a*c*x3) * j       #第三项的结果
# print(s1,s2,s3,s4)s = s1+s2+s3            #s为计算的最终结果
print("该数为:",end=' ')while True:             #判断该数是否在(n,m)范围里,如果不再通过加减若干次的公倍数,使其处于范围里if(s>n and s<m):print(s)break elif(s<n):s=s+s4           #如果小于下界,则加上公倍数,直到不小于elif(s>m):s=s-s4            #如果大于上界,则减去公倍数,直到不大于elif(s==n or s==m):print(s)break

韩信点兵计算公式与代码相关推荐

  1. 韩信点兵python程序_韩信点兵计算公式与代码

    韩信点兵计算公式与代码 问题描述: 淮安民间传说着一则故事--"韩信点兵",其次有成语"韩信点兵,多多益善". 韩信带1500名兵士打仗,战死四五百人,站3人一 ...

  2. C语言实现韩信点兵算法的代码

    下面代码段是关于C语言实现韩信点兵算法的代码. #include <stdio.h> int main() {int a=0,b=0,c=0,x;scanf("%d%d%d&qu ...

  3. 韩信点兵公式及其Java代码

    韩信点兵公式及其Java代码 问题描述: 淮安民间传说着一则故事--"韩信点兵",其次有成语"韩信点兵,多多益善". 韩信带1500名兵士打仗,战死四五百人,站 ...

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

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

  5. 【一级讲解】韩信点兵——中国剩余定理

    韩信点兵 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾 ...

  6. 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏

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

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

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

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

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

  9. 韩信点兵(python)

    ''' 韩信点兵 全部士兵按每行8人站立,剩余7人 全部士兵按每行7人站立,剩余6人 问题:已知每一营士兵人数在1000~2000之间,如何利用循环+判断表示出代码逻辑 '''for num in r ...

最新文章

  1. pyx文件 生成pyd 文件用于 cython调用
  2. 南工程计算机学院贴吧,【计算机工程学院答疑转帖】
  3. 用C/C++扩展你的PHP
  4. Java加密与解密的艺术~DigestInputStream
  5. python 取json下某一key_利用Python爬取全国250m精度的人口数据、房价数据和公交站(线路)等数据(一)...
  6. [渝粤教育] 中国地质大学 材料力学 复习题
  7. Java关键字transient
  8. 第三部分 Makefile 的工程组织
  9. Netty学习之读netty权威指南(三)
  10. matlab ttest空值,用MATLAB做T检验(ttest)
  11. 正确的握笔姿势,握笔的姿势非常的重要
  12. Mybatis起别名的方法
  13. 中间商只会赚差价?论接口的重要性
  14. python日本 老龄化分析_即将读研,求问前辈有什么研究生安利的软件 APP 或者阅读文献用的等一系列提高效率的东西吗!?...
  15. 私厨菜谱app的设计与实现(三)
  16. 【Linux】如何查找命令及历史记录history
  17. php批量获得经纬度,批量调用百度地图API获取地址经纬度坐标
  18. Windows桌面应用程序(1-2-4-4th) 您的第一个Direct2D程序
  19. 比较 KAZE 与 SIFT 的算法
  20. ai芯片fpga_AI芯片技术趋势景观GPU TPU FPGA初创公司

热门文章

  1. 最优停止理论-有限层确定问题和dp算法
  2. 小程序支付的流程是什么?用户看到的一小步,其实是后台操作的一系列复杂流程
  3. android换肤的实现方案,Android应用开发之Android一键换肤功能实现
  4. 【爬虫】哔哩哔哩弹幕爬取
  5. Eclipse中java文件图标变成空心J如何解决
  6. Unity3D游戏开发第三人称角色控制的模式
  7. 界面设计过程中的常用字体规范
  8. 两个月能学什么?零基础小白全网热门预训练模型梳理整合
  9. 对Q-Learning算法的改进:Deep Q-Learning(DQN)
  10. 基本电子元器件识别法