赞
踩
''' 韩信点兵的算法如下:他让部下按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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。