06.分支和循环的应用

看懂别人的代码很容易,但是要自己写出同样的代码却又很难。如果你也有同样的问题和困惑,千万不要沮丧,这只是因为你才刚刚开始编程之旅,你的练习量还没有达到让你可以随心所欲的写出代码的程度,只要加强编程练习,这个问题迟早都会解决的。

6.1 寻找水仙花数

 说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:$ 153=1^3+5^3+3^3 $。

#自己写的:
for i in range (100,1000):
    a=i // 100
    b=i // 10 - a*10
    c=i - a*100- b*10
    if a**3 + b**3 +c**3 == i:
        print(i)
"""
找出所有水仙花数

Version: 0.1
Author: 骆昊
"""
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,也可以利用这两个运算来实现,代码如下所示。

"""
正整数的反转

Version: 0.1
Author: 骆昊
"""
num = int(input('num = '))
reversed_num = 0
while num > 0:
    reversed_num = reversed_num * 10 + num % 10
    num //= 10
print(reversed_num)

每次取出个位上的数字再往前顶。 

 6.2 百钱百鸡问题

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

#自己写的
for a in range(0,101):
    for b in range(0,101):
        for c in range(0,101):
            if a*5 + b*3 + c*1 == 100 and a+b+3*c == 100:#把三只小鸡打包成1,不需要判断能整除3
                print(f'{a}只公鸡,{b}只母鸡,{c}只小鸡')
"""
《百钱百鸡》问题

Version: 0.1
Author: 骆昊
"""
# 假设公鸡的数量为x,x的取值范围是0到20
for x in range(0, 21):
    # 假设母鸡的数量为y,y的取值范围是0到33
    for y in range(0, 34):
        z = 100 - x - y
        if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:
            print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')

上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,只要问题的解存在就能够找到它。

6.3 CRAPS赌博游戏

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

代码要求:1000为初始钱数,包含下注输入,破产程序结束

不太符合要求的自己写的:
import random
num1 = random.randint(2,13)
if num == 7 or num == 11:
    print(f'骰子数为{num},玩家胜')
elif num == 2 or num == 3 or num == 12:
    print(f'骰子数为{num},庄家胜')
else:
    while True:
        print(f'骰子数为{num},游戏继续')
        nums = random.randint(2,13)
        if nums == num1:
            print(f'骰子数为{num},玩家胜')
            break
        elif nums == 7:
            print(f'骰子数为{num},庄家胜')
            break
"""
Craps赌博游戏
我们设定游戏开始时玩家有1000元的赌注
游戏结束的条件是玩家破产(输光所有的赌注)

Version: 0.1
Author: 骆昊
"""
from random import randint

money = 1000
while money > 0:
    print(f'你的总资产为: {money}元')
    go_on = False
    # 下注金额必须大于0小于等于玩家总资产
    while True:
        debt = int(input('请下注: '))
        if 0 < debt <= money:
            break
    # 第一次摇色子
    # 用1到6均匀分布的随机数模拟摇色子得到的点数
    first = randint(1, 6) + randint(1, 6)
    print(f'\n玩家摇出了{first}点')
    if first == 7 or first == 11:
        print('玩家胜!\n')
        money += debt
    elif first == 2 or first == 3 or first == 12:
        print('庄家胜!\n')
        money -= debt
    else:
        go_on = True
    # 第一次摇色子没有分出胜负游戏继续
    while go_on:
        go_on = False
        current = randint(1, 6) + randint(1, 6)
        print(f'玩家摇出了{current}点')
        if current == 7:
            print('庄家胜!\n')
            money -= debt
        elif current == first:
            print('玩家胜!\n')
            money += debt
        else:
            go_on = True
print('你破产了, 游戏结束!')

6.4 斐波那契数列

说明:斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究在理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律,斐波那契数列的前10个数是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。

#自己写的很拉的while循环
a = 1
b = 1
i = 3
print(a)
print(b)
while i <= 20:
    c = a + b
    print(c)
    a = b
    b = c
    i += 1
"""
输出斐波那契数列前20个数

Version: 0.1
Author: 骆昊
"""

a, b = 0, 1
for _ in range(20):
    a, b = b, a + b #先计算=号的右边b的值,a+b的值,算好了,再分别赋值给a 和b
    print(a)

知道循环次数用 for

6.5 打印100以内的素数

#自己写的错误的
for i in range(1,101):
    k=0
    for j in range(2,7):
        if i % j == 0:
            k += 1
    if k < 1:
        print(i)
"""
输出100以内的素数

Version: 0.1
Author: 骆昊
"""
for num in range(2, 100):
    # 假设num是素数
    is_prime = True
    # 在2到num-1之间找num的因子
    for factor in range(2, num):
        # 如果找到了num的因子,num就不是素数
        if num % factor == 0:
            is_prime = False
            break
    # 如果布尔值为True在num是素数
    if is_prime:
        print(num)

1. 能够整除的范围设置

2. 不需要计数判断,可以设置一个布尔量控制判断:is_prime

6.6 完成中的tips

1. randint(a,b)    生成a-b随机整数包含a,b
    range(a,b)    r产生a-b范围整数,不包括b,所以range(a,a)为空
2.for _ in range(20): 其中’_’ 是一个循环标志,也可以用i,j 等其他字母代替,下面的循环中不会用到,起到的是循环此数的作用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值