经典案例
例1:寻找水仙花数
水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:1³ + 5³ + 3³ = 153。
这个题目的关键是将一个三位数拆分为个位、十位、百位,这一点利用Python中的//
(整除)和%
(求模)运算符其实很容易做到
1
2
3
4
5
6
7
8
9
10
|
"""
找出所有水仙花数
"""
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)
|
例2:正整数反转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
"""
正整数的反转
120->21 同样成立
"""
num = int(input('num = '))
reversed_num = 0
while num > 0:
reversed_num = reversed_num * 10 + num % 10 # 得到最后一位数,下一轮将这个数提前
num //= 10 #去掉最后一位数
print(reversed_num)
# 疯狂转化(乱写的,可以直接借助字符串反转)
s = str(num)
l=list(s) # 字符串转列表
l.reverse() # 列表反转
result = "".join(l) #列表转字符串
f=int(result)
print(f,type(f))
|
例3:百钱百鸡问题
《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
"""
《百钱百鸡》问题
穷举法,暴力搜索法
注:小鸡一元三只,并且小鸡的个数应该是3 的倍数
"""
# 假设公鸡的数量为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}只')
|
例4:CRAPS赌博游戏
CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简化后的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;玩家如果摇出其他点数则玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
"""
Craps赌博游戏
我们设定游戏开始时玩家有1000元的赌注
游戏结束的条件是玩家破产(输光所有的赌注)
"""
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:
print("未分出胜负,继续摇骰子")
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:
print("未分出胜负,继续摇骰子")
go_on = True
print('你破产了, 游戏结束!')
|
例5:斐波那契数列
斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究在理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律,斐波那契数列的前10个数是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55
。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。
1
2
3
4
5
6
7
8
9
10
11
12
|
"""
输出斐波那契数列前20个数
"""
# 前两个数都是1
a, b = 1, 1
print(a, b, end=' ')
# 通过递推公式算出后面的18个数
for _ in range(18):
a, b = b, a + b # b换给a,a+b换给b,每次输出b
print(b, end=' ')
|
例6:打印素数
素数指的是只能被1和自身整除的正整数(不包括1)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
"""
输出100以内的素数
"""
for num in range(2, 100): # 2~99
# 假设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)
# 改进,
for num in range(2,100):
is_prime=True
mid=int(num**0.5)
for i in range(2,mid+1):
if num%i==0:
is_prime=False
break
if is_prime:
print(num)
|
例7:回文数
回文数是指将一个正整数从左往右排列和从右往左排列值一样的数
通过例2的正整数反转,判断如果相同就是回文数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
"""
判断输入的正整数是不是回文数
回文数是指将一个正整数从左往右排列和从右往左排列值一样的数
"""
num = int(input('请输入一个正整数: '))
temp = num # temp用来去操作num,保证num的处所值不变,方便比较
num2 = 0 # 用来记录num反转的数
while temp > 0:
num2 *= 10
num2 += temp % 10
temp //= 10
if num == num2:
print('%d是回文数' % num)
else:
print('%d不是回文数' % num)
|
例8:完美数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
"""
找出1~9999之间的所有完美数
完美数是除自身外其他所有因子的和正好等于这个数本身的数
例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14
int(math.sqrt(num)) 开根号后取整
1不是完美数,可以从2开始判断
"""
import math
for num in range(2, 10000):
result = 0 # 记录因子和
for factor in range(1, int(math.sqrt(num)) + 1):
# 因子从1 开始到根号下num
if num % factor == 0:
result += factor
if factor > 1 and num // factor != factor:
# 大于1的因子,对应的另一个因子不是本身,则另一个因为也要加到和中
result += num // factor
if result == num:
print(num)
|