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}是一个完美数')