有一群士兵,火数不超过n。韩信将其按照一行3人排队,余2人:按照一行5人排队,余1火;按照一行7人排队,刚好排成若干行。编马程序 计算士兵的人数。
<提示:可以采用穷举法求解。当人数上限比较大时,会有多种结果,要求全列举出来〉
n = int(input())
for i in range(7,n+1,7):
if i%3==2 and i%5==1:
print(i)
题目说可以采用穷举法,但是没说一定要穷举,穷举是最笨的方法,这个问题可以直接解方程,代码如下
def _remainder(n, a):
assert len(n) == len(a)
n_len = len(n)
N = 1
for i in range(n_len):
N *= n[i]
result = 0
for i in range(n_len):
m = N // n[i]
result += a[i] * m * pow(m, -1, n[i])
return result % N
n = int(input("请输入士兵的最大人数 n:"))
n_list = [3, 5, 7]
a_list = [2, 1, 0]
for i in range(3):
n_cur = n_list[i]
if n < n_cur:
n_list = n_list[:i]
a_list = a_list[:i]
break
a_list[i] %= n_cur
soldiers = _remainder(n_list, a_list)
print("士兵的人数为:", soldiers)
n = 34
arr = list(range(1,n+1)) # 所有人门外站成一队【a】,进门后依旧按序站好【b】
count,a,b = 0,arr,[]
# 开始解题
while len(a+b)>1: # 循环直到只剩1人
num,count=a.pop(0),count+1 # 排队进门,每进一人【a.pop】,按一下计数器
if count%3!=0:b.append(num) # 进门后依旧按序站好【b.append】,计数器逢3淘汰。
if a==[]:a,b=b,[] # 如果门外没人了【a=[]】,所有人重新到门外站好【a=b】
print(a[0])