Darkbule37
2021-01-31 22:40
采纳率: 100%
浏览 59
已采纳

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.正则表达式。。。

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • PythonJavaC++go 2021-02-02 15:20
    已采纳
    # !/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()
    
    
    
    
    
    评论
    解决 2 无用
    打赏 举报

相关推荐 更多相似问题