Python练习题!!求解题思路和答案!

背景:在一个岛上第0周有a只兔子(a>=50)和c只老虎(c>=5).

情况:a)兔子在n周内没有灭绝:(n表示周数,d表示n周中任意一周。)

        1.如果是奇数周(d>=3比如3,5,7,9....),每三只兔子中会有一只兔子会生出两只小兔子。

         2.如果是偶数周。每只老虎会吃掉两只兔子(一只年级最大的,一只年级最小的)

         3.所有兔子的寿命只有8周(自然死亡)

         例子:a=50, c=5 n=13 则序列为[50,50,40,66,56,92,82,136,101,167,157,245,235,365]

        b)兔子在n周之类会发生灭绝:n周内在d周兔子的数量为0,老虎的也会接着灭绝.

         例子:a=52, c=12  n=8 则序列为[52,52,28,46,22,36,12,20,0] 输出则为兔子在第8周灭绝。

任务:求解n周之后兔子存活的数量

eg.

有几周?: 21
在一开始有多少只兔子?: 82
在一开始有多少只老虎?: 10
2562 只兔子在周: 21

有几周?: 18
在一开始有多少只兔子?: 50
在一开始有多少只老虎?: 12
兔子灭绝在周: 8

希望能定义函数和用到format函数

本人Python初学者希望大佬们能用尽量简单和基础的python方法解答,不然可能看不懂eg.正则表达式。。。

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = 'QiuZiXian'  http://blog.csdn.net/qqzhuimengren/   1467288927@qq.com
# @time          :2021/1/31  9:11
# @abstract    :

'''
思路:

1. 1个列表存放第0 - n周,兔子的变化情况;(最先进入列表的,后续每增加一周,年龄自然增加一周) 

2
2.1 兔子出生
2.2 兔子被吃 (大、 小)
2.3 兔子自然死亡
2.4 判断奇偶周

3 
3.1 外部输入数据
3.2 主程序

PS: 你案例中的计算数值不对。
'''



def isOdd(d):
	'''
	判断第 d 周是奇数还是偶数
	:param d:
	:type d:
	:return: 偶数: true; 奇数 false
	:rtype:
	'''
	if d%2 == 0:
		return True
	else:
		return False


def eatOld(a, old, c):
	'''
	年纪最大的被吃
	:param a:
	:type a:
	:param old:
	:type old:
	:param c:
	:type c:
	:return:
	:rtype:
	'''
	if  a[old] - c >=0:
		a[old] = a[old] -c
		return a
	else:
		a[old] = 0
		return eatOld(a, old + 1, c-a[old])

def eatYoung(a, old, c):
	'''
	年纪最小的被吃
	:param a:
	:type a:
	:param old:
	:type old:
	:param c:
	:type c:
	:return:
	:rtype:
	'''
	if  a[old] - c >=0:
		a[old] = a[old] -c
		return a
	else:
		a[old] = 0
		return eatYoung(a, old - 1, c-a[old])

def eated(a, c):
	'''
	偶数周,被吃掉的兔子,, 更新a
	:param a:
	:type a:
	:param c:
	:type c:
	:return:
	:rtype:
	'''
	total = sum(a)
	if total > 2*c:
		a = eatOld(a, 0, c)
		a = eatYoung(a, -1, c)
	else:
		for i in range(len(a)):
			a[i] = 0
	return a

def born(a, bornTrue):
	'''
	每周新增的兔子
	小于3 或者大于3的偶数周,新生兔子0 更新a
	>3 的奇数周,新生的兔子按规则,, 更新a
	:param a:
	:type a:
	:return:
	:rtype:
	'''
	if bornTrue:
		a.append(0)
	else:
		total = sum(a)
		a.append(int(2 * total / 3))
	return a

def dead(a, d):
	'''
	自然死亡的兔子, 更新a
	:param a:
	:type a:
	:param d:
	:type d:
	:return:
	:rtype:
	'''
	if len(a) >= 8:
		for i in range(d - 7):
			a[i] = 0
	return a

def main():
	n = int(input("有几周?:").strip())
	a1 = int(input("在一开始有多少只兔子?(a>=50):"))
	c = int(input("在一开始有多少只老虎?(c>=5):"))
	a = [a1] # 第d周兔子数
	total = [a1]
	for d in range(1, n + 1):
		if d >= 2:
			if isOdd(d):
				a = eated(a, c)
		if d >=3:
			a = born(a, isOdd(d))
		else:
			a = born(a, True)
		a = dead(a, d)
		total.append(sum(a))
		print(total)
		if total[-1] == 0:
			print("兔子灭绝在周{}".format(d))
			break
		# print(a)
	else:
		print("有{}只兔子在周{}".format(sum(a), n))

if __name__ == '__main__':
	while True:
   		main()