◎知识点
舍罕王赏麦
不重复的三位数
角谷猜想
鸡兔同笼
◎脚本练习
#!/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