python解决一道数学问题

博客围绕神猴吃桃问题展开,该问题若用数学方法计算较难且耗时。而使用Python进行一次一次的递推则更为方便,通过代码运行得出在第二十五天下午,全部仙桃将被吃光。

题目是这样的:神奇岛上的神猴以仙桃为食,每天中午,每只身后各吃一个仙桃;到了晚上,岛上的神猴和仙桃都能克隆出一个自己。如果第1天上午有2000只神猴和50000个仙桃,那么到了第几天下午,全部仙桃将被吃光?

如果用数学的方法算比较困难,需要消耗一些时间。但是如果用python进行一次一次的递推,则会方便一些。

代码如下:

shen_hou = 2000  # 神猴的数量
xian_tao = 50000 # 仙桃的数量
ci_shu = 0
shang_xia = ""
while xian_tao >= 0:
    ci_shu += 1
    if ci_shu % 2 == 1:  # 下午
        shang_xia = "下午"
        xian_tao = xian_tao - shen_hou
        print(str(int((ci_shu + 1) / 2)) + shang_xia, shen_hou, xian_tao)
    else:                # 上午
        shang_xia = "上午"
        xian_tao *= 2
        shen_hou *= 2  # 分别×2
        print("")  # 每一天分隔一下
        print(str(int((ci_shu + 2) / 2)) + shang_xia, shen_hou, xian_tao)

运行的结果:

1下 2000 48000

2上 4000 96000
2下 4000 92000

3上 8000 184000
3下 8000 176000

4上 16000 352000
4下 16000 336000

5上 32000 672000
5下 32000 640000

6上 64000 1280000
6下 64000 1216000

7上 128000 2432000
7下 128000 2304000

8上 256000 4608000
8下 256000 4352000

9上 512000 8704000
9下 512000 8192000

10上 1024000 16384000
10下 1024000 15360000

11上 2048000 30720000
11下 2048000 28672000

12上 4096000 57344000
12下 4096000 53248000

13上 8192000 106496000
13下 8192000 98304000

14上 16384000 196608000
14下 16384000 180224000

15上 32768000 360448000
15下 32768000 327680000

16上 65536000 655360000
16下 65536000 589824000

17上 131072000 1179648000
17下 131072000 1048576000

18上 262144000 2097152000
18下 262144000 1835008000

19上 524288000 3670016000
19下 524288000 3145728000

20上 1048576000 6291456000
20下 1048576000 5242880000

21上 2097152000 10485760000
21下 2097152000 8388608000

22上 4194304000 16777216000
22下 4194304000 12582912000

23上 8388608000 25165824000
23下 8388608000 16777216000

24上 16777216000 33554432000
24下 16777216000 16777216000

25上 33554432000 33554432000
25下 33554432000 0

26上 67108864000 0
26下 67108864000 -67108864000

很明显,在第二十五天的下午时,仙桃被吃光了,因此答案为25天。

### 蓝桥杯 Python 数学问题题目及解答 #### 题目一:质数判断 在编程竞赛中,质数是一个常见的主题。下面是一道典型的质数判断题目。 **题目描述** 给定一个正整数 n,请编写程序来判断该数字是否为质数。如果输入的数字是质数,则返回 True;如果不是,则返回 False。 **解决方案** 要解决这个问题,可以采用试除法。具体来说,就是尝试用小于等于 sqrt(n) 的所有自然数去除 n,看是否有能整除的情况存在。如果有任何一个数能够整除 n,则说明 n 不是质数[^1]。 ```python import math def is_prime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True ``` 此函数通过遍历从 2 到根号下 n 的所有可能因子来进行测试。一旦找到任何因数即可立即断言不是质数并退出循环。 --- #### 题目二:最大公约数求解 另一个经典的数学问题是计算两个整数的最大公约数(GCD),这可以通过欧几里得算法实现。 **题目描述** 给出两个非负整数 a 和 b,请求出它们之间的最大公因数 GCD(a,b),即最大的那个既能被a又能被b整除的正整数。 **解决方案** 利用辗转相减的方法或者更高效的取模运算方式——也就是常说的“带余除法”,直到两数值相同为止,此时得到的结果便是所求的最大公约数[^3]。 ```python def gcd(a, b): while b != 0: temp = b b = a % b a = temp return abs(a) # 或者使用内置库 from math import gcd as builtin_gcd print(builtin_gcd(48, 18)) ``` 上述代码展示了如何手动实现以及调用标准库中的 `gcd` 函数两种途径来解决问题。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值