'''
韩信点兵的算法如下:他让部下按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
文章讲述了韩信点兵的故事,通过编程演示了两种方法求解士兵总数:一是直接根据给定条件筛选,二是利用孙子算经原理计算公倍数。两种方法都展示了如何利用余数规则找出特定范围内的符合条件的士兵人数。
1639

被折叠的 条评论
为什么被折叠?



