Python基础(32)–经典练习题:舍罕王赏麦、不重复的三位数、角谷猜想、鸡兔同笼

◎知识点

  1. 舍罕王赏麦

  2. 不重复的三位数

  3. 角谷猜想

  4. 鸡兔同笼


◎脚本练习

#!/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

◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_basic/python_practice.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/4930.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注