Python中的程序逻辑经典案例详解

我的博客

文章首发于公众号:小肖学数据分析

Python作为一种强大的编程语言,以其简洁明了的语法和强大的标准库,成为了理想的工具来构建这些解决方案。

本文将通过Python解析几个经典的编程问题。

经典案例

水仙花数

问题描述:水仙花数指的是一个n位数,它的各位数字的n次幂之和等于它自身。例如,对于三位数153,其满足1^3 + 5^3 + 3^3 = 153,因此它是一个水仙花数。

Python代码实现

def is_narcissistic(number):
    # 将数字转换成字符串,便于后续遍历其各个位上的数字
    digits = [int(d) for d in str(number)]
    # 比较原数和其各位数字幂次和是否相等,从而判断是否为水仙花数
    return sum(d**len(digits) for d in digits) == number

# 检索并打印出所有三位水仙花数
narcissistic_numbers = [num for num in range(100, 1000) if is_narcissistic(num)]
print("水仙花数:", narcissistic_numbers)
百钱百鸡

问题描述:古中国数学家提出的问题。现有100文钱,需要买100只鸡。其中公鸡每只5文钱,母鸡每只3文钱,小鸡3只1文钱。如何买?

Python代码实现

def calculate_hundred_chickens():
    solutions = []
    # 遍历公鸡的可能数目
    for roosters in range(21):  # 公鸡最多买20只
        # 遍历母鸡的可能数目
        for hens in range(34):  # 母鸡最多买33只
            # 通过总数和总金额限制计算小鸡数目
            chicks = 100 - roosters - hens
            if 5 * roosters + 3 * hens + chicks / 3 == 100:
                solutions.append((roosters, hens, chicks))
    return solutions

# 输出可能的买鸡方案
print("百钱买百鸡的方案:", calculate_hundred_chickens())
Craps骰子游戏

问题描述:玩家掷两个骰子,如果第一次掷出7点或11点则玩家胜,掷出2点、3点或12点则庄家胜,其他点数玩家继续掷骰,直到点数重复则玩家胜,掷出7点则庄家胜。

Python代码实现

from random import randrange

def roll_dice():
    # 模拟掷骰子,返回两个骰子点数之和
    return randrange(1, 7) + randrange(1, 7)

def play_craps():
    # 第一轮掷骰子结果
    point = roll_dice()
    # 玩家胜利的点数
    wins = {7, 11}
    # 庄家胜利的点数
    losses = {2, 3, 12}
    # 根据第一轮的结果判断胜负
    if point in wins:
        return "玩家胜利!"
    elif point in losses:
        return "庄家胜利!"
    # 若未分出胜负,继续游戏
    while True:
        roll = roll_dice()
        if roll == point:
            return "玩家胜利!"
        elif roll == 7:
            return "庄家胜利!"

# 模拟游戏并输出结果
print("Craps赌博游戏结果:", play_craps())

进阶练习题

斐波那契数列

问题描述:斐波那契数列是这样一个数列,除前两个数字外,每个数字都是前两个数字之和。求斐波那契数列的第n项。

Python代码实现

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    # 基准情况处理
    if n in (0, 1):
        return n
    # 递归求解斐波那契数列的前两项
    return fibonacci(n-1) + fibonacci(n-2)

# 计算前20个斐波那契数列数并打印
for i in range(20):
    print(fibonacci(i), end=" ")
print()
完美数

问题描述:一个等于其所有真因子(即除了自身以外的约数)之和的数称为完美数。求不超过10000的所有完美数。

Python代码实现

def is_perfect_number(n):
    # 计算除自身外所有因子的和
    factors = [1] + [i for i in range(2, int(n**0.5)+1) if n % i == 0]
    # 检查因子和是否等于原数
    return sum(factors) + sum(n // i for i in factors if i != 1 and n // i != i) == n

# 寻找并打印所有完美数
print([n for n in range(2, 10001) if is_perfect_number(n)])
素数生成

问题描述:素数是只能被1和它自己整除的大于1的数。求不超过100的所有素数。

Python代码实现

def eratosthenes_sieve(limit):
    # 创建一个布尔数组,初始假设所有数字都是素数
    primes = [True] * limit
    # 用埃拉托斯特尼筛法筛选素数
    for num in range(2, int(limit**0.5) + 1):
        if primes[num]:
            # 将num的倍数标记为非素数
            primes[num*num:limit:num] = [False] * ((limit - num*num - 1) // num + 1)
    # 筛选并返回素数列表
    return [num for num in range(2, limit) if primes[num]]

# 打印100以内的素数
print(eratosthenes_sieve(100))

结语

掌握构建程序的逻辑,就像攀登一座山峰。在这个过程中,我们不断地解决问题,逐步攀升,直到最终达到顶峰。让我们享受编程带来的挑战和乐趣。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值