【Python】水仙花数、百钱买百鸡、CRAPS游戏、斐波那契数列、完美数、素数

1.寻找水仙花数

水仙花数:是一个3位数,每一位上数字的立方和正好等于它本身,如:13+53+33 = 153,则153就是一个水仙花数,也称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数。

用除法和取模运算分别取出个位十位百位数字,low、mid、high,再进行if判断。

for num in range(100, 1000):
    low = num % 10
    mid = num // 10 % 10
    high = num // 100
    if num == low ** 3 + mid * 3 + high ** 3:
        print(num)

用上述方法将输入的正整数反转,如将12345变成54321。
先取出个位数5,然后乘以10加上取出的4,循环如此。

num = int(input('num = '))
reversed_num = 0
while num > 0:
    reversed_num = reversed_num * 10 + num % 10
    num //= 10
print(reversed_num)

2.百钱买百鸡

公鸡5元一只,母鸡3元一只,小鸡1元一只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

把公鸡、母鸡、小鸡的数量用x、y、z来表示。
如果都用来买公鸡,x最大可取20,range(0,20)从0开始。
同理y最大可取33,z用总数和减x、y。

for x in range(0,20):
    for y in range(0,33):
        z = 100-x-y
        if 5*x+3*y+z/3==100:
            print('公鸡:%d只,母鸡:%d只,小鸡:%d只' % (x,y,z))

两层for循环一项一项穷举,也称为暴力搜索法,很慢,但是一定可以找出答案。

3.CRAPS赌博游戏

第一次掷骰子,点数和为7或11,则玩家胜;点数和为2、3或12,玩家输。
点数和为其他则继续掷。
第二次掷骰子,点数和与第一次掷相同,则玩家胜;点数和为7,则玩家输。
点数和为其他则继续掷。往后的输赢条件与第二次相同。

image

from random import randint

money = 1000
while money > 0:
    print('你的总资产为:', money)
    loopFlag = False

    while True:
        debt = int(input('请下注:'))
        if 0 < debt <= money:
            break

    first = randint(1, 6) + randint(1, 6)
    print('玩家摇出了%d点' % first)

    if first == 7 or first == 11:
        print('玩家胜!')
        money += debt
    elif first == 2 or first == 3 or first == 12:
        print('庄家胜!')
        money -= debt
    else:
        loopFlag = True

    while loopFlag:
        loopFlag = False
        current = randint(1, 6) + randint(1, 6)
        print('玩家摇出了%d点' % current)

        if current == 7:
            print('庄家胜')
            money -= debt
        elif current == first:
            print('玩家胜')
            money += debt
        else:
            loopFlag = True

print('你破产了,游戏结束!')

image

4.生成斐波那契数列的前20个数

斐波那契数列:前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,如:1,1,2,3,5,8,13,21……;又称为黄金分割数列、兔子数列。

a = 0
b = 1
for _ in range(20):
    a, b = b, a + b
    print(a, end=',')

下划线_表示一个循环变量,类似于其他语言for循环中的i,j。
a,b = b,a+b可以写为(a,b) = (b,a+b),先计算右边括号的,再赋值给左边的a和b。end = ','表示用逗号代替换行结尾。

image

5.找出10000以内的完美数

完美数:所有的真因子的和恰好等于它本身,如6 = 1+2+3;28 = 1+2+4+7。
又称为完全数或完备数,真因子(除了自身以外的因子)。

math.sqrt()函数表示开平方根,如math.sqrt(9) = 3。
为什么因子只取到开平方?
比如6开平方根之后得到2.4,因子有如下,每对因子,必定一个大于2.4,一个小于2.4,如果12.4中没有因子,那么2.46中也没有因子,因此只需判断1~根号(x)中是否有因子。
1×6
2×3
3×2
6×1

import math

for num in range(1, 10000):
    result = 0
    for factor in range(1, int(math.sqrt(num)) + 1):
        if num % factor == 0:  #是否是因子
            result += factor
            if factor > 1 and num // factor != factor: #因子是否大于1且不等于它本身
                result += num // factor
    if result == num:
        print(num)

6.输出100以内所有的素数

素数:只能被1和它自身整除的正整数,不包括1(因此从2开始)。
如:2,3,5,7,11,13,17,19

import math

for num in range(2, 100):
    is_prime = True
    for factor in range(2, int(math.sqrt(num)) + 1):
        if num % factor == 0:
            is_prime = False
            break
    if is_prime:
        print(num, end=',')
posted @ 2022-11-30 14:09  植树chen  阅读(566)  评论(0)    收藏  举报