day5-循环案例

day5-循环案例

1、百钱百鸡问题

公鸡5元一只,母鸡3元一只,小鸡1元三只,欲用100买100只鸡,问公鸡、母鸡、小鸡各多少只?

思路:设买公鸡、母鸡、小鸡各x,y,z只,则有 5x+3y+z/3=100 和 x+y+z=0;

​ 考虑只买公鸡,则可以买20只公鸡,所以x的取值为0到20;考虑只买母鸡,则可以最多可以买33只,所以y的取值为0到33,则z = 100 -x -y

# 穷举法
money = 100
for x in range(0,21):
    for y in range(0,34):
        z = 100 - x - y
        if z % 3 == 0 and 5 * x + 3 * y + z // 3 == 100:
            print(f'公鸡、母鸡、小鸡各有{x}{y}{z}只')

2、捕鱼问题

有ABCDE五个人取捕鱼,捕完鱼太累倒头睡觉。第二天,A第一个醒过来,他把鱼分成五分,扔掉多余的一条,拿走自己的一份;B第二个醒过来,他以为鱼还没有分过,把鱼分成5分,扔掉多余的1条,拿走自己的一份;C、D、E依次醒过来,都是按照上面的方法,把鱼分成5条,扔掉多余的一条。问:他们最少捕了多少条鱼?

思路:先假设最少有6条鱼,然后利用循环,不满足条件时每次增加5条,循环直至找到满足条件的最少条鱼

fish = 6
while True:
    t = fish
    is_enough = True
    # 模拟分鱼的过程
    for _ in range(5):
        if (t - 1) % 5 == 0:
            t = (t - 1) // 5 * 4
        else:
            is_enough = False
            break
    if is_enough:
        break
    fish += 5
print(f'最少有{fish}条鱼')

3、CRAPS赌博游戏 – 摇两颗色子

游戏规则:玩家摇色子,如果第一次要摇出了7点或者11点,玩家胜;如果摇出2点,3点,12点,庄家胜;其他情况,游戏继续,玩家重新摇色子,如果摇出了第一次摇的点数,玩家胜;
如果摇出7点,庄家胜;其他情况,游戏继续,直到分出胜利。
1、把游戏的场景模拟出来,输出玩家胜还是庄家胜;
2、玩家一开始有1000元,每次玩的时候下注,赢了获得对应的注码;输了就输掉对应的注码;
3、游戏结束的条件是玩家破产

import random
'''
# 也可以定义函数
# 可以摇n颗色子
def roll_dice(n):    #摇色子  n代表色子的数量
    total = 0
    for _ in range(n):
        total += random.randrange(1,7)
    return total     #色子摇出的点数
'''

money = 1000
while money > 0:
    print(f'你的总资产为:{money}元')
    bet = 0
    if money > 0 or money <= 1000:
        bet = int(input('请下注:'))
    #游戏场景
    face1 = random.randrange(1, 7)
    face2 = random.randrange(1, 7)
    first_piont = face1 + face2
    if first_piont in (7, 11):
        print(f'玩家胜利!!!')
        money += bet
    elif first_piont in (2, 3, 4):
        print(f'庄家胜利!!!')
        money -= bet
    else:
        while True:
            face1 = random.randrange(1, 7)
            face2 = random.randrange(1, 7)
            current_piont = face1 + face2
            if current_piont == first_piont:
                print(f'玩家胜利!!!')
                money += bet
                break
            elif current_piont == 7:
                print(f'庄家胜利!!!')
                money -= bet
                break
print(f'你破产了,game over!!!')

4、把两颗色子摇10000次,统计每种点数出现的次数,频率

思路:调用random函数,再通过循环计算每种点数出现的次数和频率

import random
def roll_dice():
    face1 = random.randrange(1, 7)
    face2 = random.randrange(1, 7)
    return face1 + face2

c2 = c3 = c4 = c5 = c6 = c7 = c8 = c9 = c10 = c11 = c12 = 0
for _ in range(10000):
    face = roll_dice(2)
    if face == 2:
        c2 += 1
    elif face == 3:
        c3 += 1
    elif face == 4:
        c4 += 1
    elif face == 5:
        c5 += 1
    elif face == 6:
        c6 += 1
    elif face == 7:
        c7 += 1
    elif face == 8:
        c8 += 1
    elif face == 9:
        c9 += 1
    elif face == 10:
        c10 += 1
    elif face == 11:
        c11 += 1
    else:
        c12 += 1
print(f'2点出现了{c2}次,频率:{c2 / 10000}')
print(f'3点出现了{c3}次,频率:{c3 / 10000}')
print(f'4点出现了{c4}次,频率:{c4 / 10000}')
print(f'5点出现了{c5}次,频率:{c5 / 10000}')
print(f'6点出现了{c6}次,频率:{c6 / 10000}')
print(f'7点出现了{c7}次,频率:{c7 / 10000}')
print(f'8点出现了{c8}次,频率:{c8 / 10000}')
print(f'9点出现了{c9}次,频率:{c9 / 10000}')
print(f'10点出现了{c10}次,频率:{c10 / 10000}')
print(f'11点出现了{c11}次,频率:{c11 / 10000}')
print(f'12点出现了{c12}次,频率:{c12 / 10000}')

5、找出10000以内的完美数

完美数:如果一个数等于除自身以外的所有因子的和,那么这个数就叫做完美数
例如:6 = 1 + 2 + 3

for i in range(1, 10001):
    sum = 0
    for j in range(1, i):
        if i % j == 0:
            sum += j
    if i == sum:
        print(f'{i}是一个完美数')
        
#优化方法:可以减少循环的次数
for i in range(1, 10001):
    sum = 0
    for j in range(1, int(i ** 0.5) + 1):   #前半截因子
            if i % j == 0:
                sum += j
                if i != i / j:
                    sum += i // j   #加上后半截的因子
    if i == sum:
        print(f'{i}是一个完美数')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值