用Python实现韩信点兵算法

'''
韩信点兵的算法如下:他让部下按1-3,1-5,1-7报数,并用每次报数的余数计算士兵总数,一次集合中,1-3报数余2,1-5报数余3,1-7报数余2,已知他们队伍人数在900—1000人之间。
编程求出当天到的士兵数。
'''

for i in range(900,1000):
    if i%3==2 and i%5==3 and i%7==2:
        print(i)
'''淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”。
韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信很快说出人数:1049。
'''
for i in range(1000,1100):
    if i%3==2 and i%5==4 and i%7==6:
        print(i)

于是形成代码一:

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())

for l in range(n,m):
    if l%a==i and l%b==j and l%c==k:
        print(l)

根据孙子算经解法,生成代码二:

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              #用于判断余数是否为1

while True:                   #计算出每一项中的倍数x1,x2,x3
	t1 = (b*c*x1) % a == 1
	t2 = (a*b*x2) % c == 1
	t3 = (a*c*x3) % b == 1
	if(not t1):
		x1+=1
	if(not t2):
		x2+=1
	if(not t3):
		x3+=1
	if(t1 and t2 and t3):
		break

s1 = (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

物联沃分享整理
物联沃-IOTWORD物联网 » 用Python实现韩信点兵算法

发表评论