构造程序逻辑
本次是对之前学的语言元素、分支结构、循环结构的一个综合练习。
题目如下:
寻找水仙花数。
说明:水仙花数也被称为超完全数字,它是一个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=" ")