level 3
这三道题我都做过,这里都有缩进,自己调整。
猴子分桃问题,可以逆推,也可以顺推。假设初始桃子个数为a,数列公式:
An+4=(a+4)*(4/5)^n
顺推,代码如下:
def peach(n,total):
if n == 0:
return total
else:
return peach(n-1,total) * 4 // 5
flag,total = 1,0
while flag:
total += 5
for i in range(5):
if peach(i,total) % 5 > 0:
break
else:
flag = 0
print(f'海滩上原来最少有{peach(0,total)-4}个桃子.')
这里有缩进,自己调整。
逆推,参考菜鸟教程,代码如下:
num = counter = 0
while counter < 5:
num,x = num + 4,num
for i in range(5):
if x % 4 > 0:
counter = 0
break
else:
counter += 1
x = 1 + x * 5 // 4
print(f'海滩上原来最少有{x}个桃子.')
约瑟夫环问题。
解法一,经典的公式法递归,参考公式
josephus(n,m)= (josephus(n-1,m) + m) % n:
def josephus(n,m):
if n == 1:
return 0
else:
return (josephus(n-1,m) + m) % n
n = int(input('请输入总人数:'))
m = int(input('请输入指定号码:'))
print(f'活下来的人的编号为:{josephus(n,m)+1}')
解法二,列表切片,思路:
先建立一个顺序编号1-N的列表,然后依次删除该列表中编号为M % num-1的元素(通过列表切片完成),其中num等于列表长度。每删除一个元素建立新的列表,新列表第一个元素从M % num开始编号,直到最后一个元素,然后连接第一个元素到删除的元素前一位的列表。
def josephus(n,m):
seq=[num for num in range(1,n+1)]
for num in range(n,1,-1):
r = m % num
if r == 0:
seq = seq[:-1]
if r == 1:
seq = seq[1:]
if r > 1:
seq = seq[r:] + seq[:r-1]
return seq[0]
n = int(input('请输入总人数:'))
m = int(input('请输入指定号码:'))
print(f'活下来的人的编号为:{josephus(n,m)}')
回文数就没什么说的,可以参考字符串切片,例如一个字符串sr,
sr[::-1]就是字符串反向输出,判断sr与sr[::-1]是否相等即可判断sr是否是回文数。
如果输入的是数字,你需要用str函数转换为字符串。
2021年05月26日 07点05分


