背景:在一个岛上第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()