◎知识点
舍罕王赏麦
不重复的三位数
角谷猜想
鸡兔同笼
◎脚本练习
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@FileName: python_practice.py
@Function: python practice
@Author: Zhihe An
@Site: https://chegva.com
@Time: 2021/7/5
"""
"""一、舍罕王赏麦"""
"""
【问题描述】
据说印度的舍罕王打算重赏一个宰相,问他有何要求,
这位宰相说:"陛下,请您在这张棋盘的第一个格内赏给我一粒麦子,在第二个格内赏给我两粒麦子,
在第三个格内赏给我四粒麦子,照这样每一格内都比前一格多一倍,把这棋盘的64个格都放满就行啦"。
舍罕王听后,认为这区区赏金微不足道,于是满口答应道:"爱卿,你所要求的并不多啊,
你当然会如愿以偿。"
请问:共需要赏赐给这位宰相多少粒麦子?
【设计思路】
通过循环计算当前格子的麦子数及当前所有格子的麦子数之和
"""
def sheshanwang(n):
"""计算舍罕王赏赐给宰相的麦子数"""
t = 1 # 初始化当前格子的麦子数
s = 1 # 初始化当前所有格子的麦子数之和
# 通过循环计算当前格子的麦子数及当前所有格子的麦子数之和
for _ in range(2, n+1):
t *= 2 # 计算当前格子的麦子数
s += t # 计算当前所有格子的麦子数之和
return s
print('舍罕王赏赐给宰相的麦子数:', sheshanwang(64))
# 使用列表生成式,一行语句就可以搞定
print('舍罕王赏赐给宰相的麦子数:', sum([2 ** i for i in range(64)]))
"""二、不重复的三位数"""
"""
【问题描述】
统计0~9这10个数字可以组成多少个不重复的三位数
【设计思路】
根据排列组合的数学知识可知:0~9这10个数字可以组成不重复的三位数的个数为:9 * 9 * 8 = 648
设三位数的百位、十位和个位分别为a、b和c,其取值范围分别为[1, 9]、[0, 9]和[0, 9]
通过三重循环穷举a、b和c的值,在穷举的过程中,只要三者两两不相等,就找到了一个符合条件的解
"""
counter = 0
# 设三位数的百位、十位和个位分别为a、b和c,其取值范围分别为[1, 9]、[0, 9]和[0, 9]
# 通过三重循环穷举a、b和c的值
for a in range(1, 10):
for b in range(10):
for c in range(10):
# 在穷举的过程中,只要三者两两不相等,就找到了一个符合条件的解
if a != b and b != c and c != a:
counter += 1
"""
for a in range(1, 10):
for b in range(10):
if a == b:
continue
for c in range(10):
if b != c and c != a:
counter += 1
"""
print(counter)
"""三、角谷猜想"""
"""
【问题描述】
日本的角谷提出了一个猜想,猜想的内容是:对于任意的自然数,反复进行如下运算:
(1) 若为奇数,则乘以3后加1
(2) 若为偶数,则除以2
总可以得到运算结果1
到目前为止,既不能证明角谷猜想是正确的,也不能举出反例说明角谷猜想是错误的
对于任意给定的自然数,验证角谷猜想
【设计思路】
通过循环反复进行角谷猜想中的两种运算,当运算结果为1时则退出循环
"""
def jiaogu(n):
"""对于任意的自然数,验证角谷猜想"""
nc = n
# 通过循环反复进行角谷猜想中的两种运算,当运算结果为1时则退出循环
while nc != 1:
nc = nc * 3 + 1 if nc % 2 else nc / 2
print('%d符合角谷猜想' % n)
jiaogu(18)
jiaogu(27)
"""四、鸡兔同笼"""
"""
【问题描述】
在同一个笼子里有若干只鸡和兔,从上面数共有h个头,从下面数共有f只脚。求笼子里鸡和兔的只数
【设计思路】
设鸡和兔的只数分别为x和y,根据题意可得如下方程组:
(1) x + y = h
(2) 2x + 4y = f
由方程(1)可知,x的取值范围是[1, h - 1],且y = h - x
通过循环穷举x,以穷举的过程中,只要x满足方程(2),则得到了符合条件的解
"""
def chicken_rabbit(h, f):
"""求笼子里鸡和兔的只数"""
for x in range(1, h):
y = h - x
if 2 * x + 4 * y == f:
print('鸡的只数:%d, 兔的只数: %d' % (x, y))
return
chicken_rabbit(35, 94) # 鸡的只数:23, 兔的只数: 12