Day 5 练习代码逻辑

本文介绍了几个经典的编程案例,包括寻找水仙花数、正整数反转、解决百钱百鸡问题、CRAPS赌博游戏模拟、生成斐波那契数列和查找完美数及素数。这些示例展示了基础数学概念在编程中的应用和Python语言的实用性。
摘要由CSDN通过智能技术生成

经典案例

1.寻找水仙花数。
水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身。

"""
找出所有水仙花数
"""
result = []
for num in range(100, 1000):
    # 将数字转换为字符串,以便逐位访问
    num_str = str(num)
    # 计算每个位上数字的立方和
    sum_of_cubes = sum(int(digit) ** 3 for digit in num_str)
    # 如果立方和等于该数本身,则将其添加到结果列表中
    if sum_of_cubes == num:
        result.append(num)

print("100到1000之间的水仙花数:", result)

2.正整数反转。

num = 1234
reversed_num = int(str(num)[::-1])
print(reversed_num)

第二种方法:

num = int(input("请输入一个正整数:"))
reversed_num = 0

while num > 0:
    digit = num % 10
    reversed_num = reversed_num * 10 + digit
    num = num // 10

print("反转后的数字为:", reversed_num)

3.百钱百鸡问题。
百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

for num_cock in range(0, 21):  # 公鸡数量范围为0到20
    for num_hen in range(0, 34):  # 母鸡数量范围为0到33
        num_chick = 100 - num_cock - num_hen  # 小鸡数量等于总数减去公鸡和母鸡的数量

        # 判断是否满足总价为100元的条件
        if num_cock * 5 + num_hen * 3 + num_chick / 3 == 100 and num_chick % 3 == 0:
            print("公鸡数量:", num_cock)
            print("母鸡数量:", num_hen)
            print("小鸡数量:", num_chick)
            print()

4.CRAPS赌博游戏。
CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。

import random

player_money = 1000  # 玩家的赌注初始金额为1000元

while player_money > 0:
    print("玩家当前赌注金额:", player_money)
    bet = int(input("请输入赌注金额(输入0结束游戏):"))

    if bet == 0:
        print("游戏结束。")
        break

    if bet > player_money:
        print("赌注金额超过玩家拥有的金额,请重新输入。")
        continue

    dice1 = random.randint(1, 6)
    dice2 = random.randint(1, 6)
    first_roll = dice1 + dice2
    print("第一次摇骰子点数为:", first_roll)

    if first_roll == 7 or first_roll == 11:
        print("玩家胜利!")
        player_money += bet
    elif first_roll == 2 or first_roll == 3 or first_roll == 12:
        print("庄家胜利!")
        player_money -= bet
    else:
        while True:
            dice1 = random.randint(1, 6)
            dice2 = random.randint(1, 6)
            next_roll = dice1 + dice2
            print("继续摇骰子点数为:", next_roll)
            if next_roll == first_roll:
                print("玩家胜利!")
                player_money += bet
                break
            elif next_roll == 7:
                print("庄家胜利!")
                player_money -= bet
                break

if player_money <= 0:
    print("玩家输光了所有的赌注,游戏结束。")

5.生成斐波那契数列的前20个数。
斐波那契数列(Fibonacci sequence),又称黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中提出一个在理想假设条件下兔子成长率的问题而引入的数列,所以这个数列也被戏称为"兔子数列"。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。

fibonacci_sequence = [0, 1]  # 斐波那契数列的前两个数

while len(fibonacci_sequence) < 20:
    next_number = fibonacci_sequence[-1] + fibonacci_sequence[-2]  # 计算下一个斐波那契数
    fibonacci_sequence.append(next_number)  # 添加到数列中

print(fibonacci_sequence)

6.找出10000以内的完美数。
完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。

perfect_numbers = []

for num in range(1, 10000):
    factors = []
    for i in range(1, num):
        if num % i == 0:
            factors.append(i)

    if sum(factors) == num:
        perfect_numbers.append(num)

print("10000以内的完美数:", perfect_numbers)

7.输出100以内所有的素数。
素数指的是只能被1和自身整除的正整数(不包括1)。

prime_numbers = []

for num in range(2, 101):
    is_prime = True
    for i in range(2, num):
        if num % i == 0:
            is_prime = False
            break

    if is_prime:
        prime_numbers.append(num)

print("100以内的素数:", prime_numbers)

优化:一般来说,我们只需要检查一个数是否能被从 2 到它的平方根的范围内的数
整除。
为什么是平方根呢?假设一个数 N 可以被大于它的平方根的数 X 整除,即 N = X * Y。如果 X 大于 N 的平方根 sqrt(N),那么 Y 必然小于 sqrt(N),因为 X * Y = N,所以 Y = N / X。也就是说,如果一个数 N 可以被大于它的平方根的数整除,那么它必定也可以被小于它的平方根的数整除。
因此,通过只检查从 2 到平方根的范围内的数,我们就可以确定一个数是否为素数。如果在这个范围内找不到能整除它的数,那么它就是素数。
使用这种方法,我们可以减少不必要的计算量,提高判断素数的效率。因为在一个数的平方根之后,再出现能整除它的数的概率就会很低了。这样,在判断大数是否为素数时,就能更快地找到答案,节省计算资源。

prime_numbers = []

for num in range(2, 101):
    is_prime = True
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            is_prime = False
            break

    if is_prime:
        prime_numbers.append(num)

print("100以内的素数:", prime_numbers)

我们使用两个嵌套的 for 循环来遍历从2到100的每个数字。对于每个数字,我们检查它是否能被从2到它的平方根(取整数部分)的范围内的任何数字整除。

如果能整除,则该数字不是素数,将 is_prime 设为 False,然后跳出内层循环。如果不能整除,则该数字是素数,将其添加到列表 prime_numbers 中。

最后,我们输出列表 prime_numbers 中存储的100以内的所有素数。

运行代码后,你将得到100以内的所有素数:

100以内的素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Day 5 is over! fighting!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值