Python学习之构造程序逻辑

构造程序逻辑

本次是对之前学的语言元素、分支结构、循环结构的一个综合练习。

题目如下:

寻找水仙花数。

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

num=int(input("请输入一个三位数:"))
bai=int(num/100)
shi=int((num-bai*100)/10)
ge=num%10
#print(bai,shi,ge)
if ge**3+shi**3+bai**3==num:
    print(f'{num}是水仙花数')
else:
    print(f'{num}不是水仙花数')

上面程序是按照之前编写C程序的思路,事实上,Python有整除//这个很好用的运算符,故程序可以改进成以下:

num=int(input("请输入一个三位数:"))

bai=num//100

shi=num//10%10

ge=num%10

#print(bai,shi,ge)

if ge**3+shi**3+bai**3==num:

    print(f'{num}是水仙花数')

else:

    print(f'{num}不是水仙花数')

百钱百鸡问题。

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

for i in range(1,20):

    for j in range(1,33):

        for k in range(1,101):

            if (i+j+k)==100 and i*5+j*3+k/3==100:

                print(f'公鸡{i}只,母鸡{j}只,小鸡{k}只')

以上算法用了暴力列举的方法。这种方法只适合于运算量比较小的程序。

CRAPS赌博游戏。

说明:CRAPS是美国的一种桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。

import random

counter=1

while True:

    print(f'第{counter}回合:')

    num1=random.randint(1,6)

    num2 = random.randint(1, 6)

    print(f'两次摇骰子的结果是:{num1},{num2}')

    if num1+num2==7 or num1+num2==11:

        print("玩家胜!")

        break;

    elif num1+num2==2 or num1+num2==3 or num1+num2==11:

        print("庄家胜!")

        break;

    else:

        print("继续")

    counter+=1

改进:加入总资产和赌注,程序改进如下:

import random

counter=1

money=1000

debt=int(input("请输入赌注:"))

while money>0:

    print(f'第{counter}回合:')

    num1=random.randint(1,6)

    num2 = random.randint(1, 6)

    print(f'两次摇骰子的结果是:{num1},{num2}')

    if num1+num2==7 or num1+num2==11:

        print("玩家胜!")

        money = money + debt

        print(f'您最终资产为{money}')

        break;

    elif num1+num2==2 or num1+num2==3 or num1+num2==11:

        print("庄家胜!")

        money = money - debt

        print(f'您最终资产为{money}')

        break;

    else:

        money = money - debt

        if money>0:

            print(f'您当前资产为{money},继续')

        else:

            print("您破产了!")

        print()

    counter+=1

 这里需要注意的是:random.randint()函数里包含两个参数,生成随机数的范围是包含两个端点的。

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

说明:斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 该程序需要借助一个中间变量c来暂存a+b的值,之后a b分别更新

a=1

b=1

print(a,end=" ")

for i in range(1,20):

    c=a+b

    a=b

    b=c

    print(a,end=" ")

找出10000以内的完美数。

说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美数。如何存放这些因子?用了一个变量result存放每次能整出的因子的和。

import math

for i in range(2,10000):

    result=0

    for j in range(1,int(i/2)+1):

        if i%j==0:

            result+=j;

            #print(j)

    if result==i:

        print(i)

上面的程序太过暴力,得出8128这个结果机器耗费时间肉眼可见的长。可以改进为:

import math

for num in range(2, 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:

                result += num // factor

    if result == num:

        print(num)

for factor in range(1, int(math.sqrt(num)) + 1)的思路是只遍历某个数开平方根的因子,大于平方根的因子a总与一个小于平方根的因子b有a*b等于该数的关系。故if factor > 1 and num // factor != factor这里多加一个判断,从而求出b对应的a。

输出100以内所有的素数。

说明:素数指的是只能被1和自身整除的正整数(不包括1)。

for i in range(3,101):

    flag = True

    for j in range(2,i):

        if i%j==0:

            flag=False

            break;

    if flag:

        print(i,end=" ")

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值