有三道题(答案已给),想请教一下详细的解题思路🙏🏻
python3吧
全部回复
仅看楼主
level 3
有三道题(答案已给),想请教一下详细的解题思路🙏🏻
2021年05月25日 12点05分 1
level 1
这三道题我都做过,这里都有缩进,自己调整。
猴子分桃问题,可以逆推,也可以顺推。假设初始桃子个数为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分 2
谢谢谢谢!!
2021年05月27日 04点05分
level 5
s = input('请输入数字:')
#转换为列表a = list(s)#
倒叙a.reverse()#比较if s == ''.join(a):print(f'{s}是回文数')else:print(f'{s}不是回文数')
2021年05月26日 12点05分 3
level 5
n = int(input('请输入人数:'))a = []for i in range(1,n+1):a.append(i)
while len(a) > 2:
#清空b = []#
保存前2个b.append(a[0])b.append(a[1])#删除前3个for j in range(3):a.pop(0)#末尾添加前2个a.append(b[0])a.append(b[1])#删3加2,相当于删除报数3,并后移1、2到末尾
#输出第2个,只剩2人绝对淘汰第1个print(a[1])
2021年05月26日 13点05分 4
level 5
#初始化,桃子数为1n = 1while True:#
初始化次数flag = 0m = n
#分5次桃子for i in range(5):#
剩余桃子数m = (m - 1) / 5 * 4#剩余桃子数大于0且为整数if m == int(m) and m > 0:#次数加1flag += 1else:break#次数为5,结束if flag == 5:print(n)break#数量加1n += 1
2021年05月26日 17点05分 5
谢谢!非常感谢!!
2021年05月27日 04点05分
1