经典案例
1.寻找水仙花数。
水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身。
"""
找出所有水仙花数
"""
result = []
for num in range(100, 1000):
# 将数字转换为字符串,以便逐位访问
num_str = str(num)
# 计算每个位上数字的立方和
sum_of_cubes = sum(int(digit) ** 3 for digit in num_str)
# 如果立方和等于该数本身,则将其添加到结果列表中
if sum_of_cubes == num:
result.append(num)
print("100到1000之间的水仙花数:", result)
2.正整数反转。
num = 1234
reversed_num = int(str(num)[::-1])
print(reversed_num)
第二种方法:
num = int(input("请输入一个正整数:"))
reversed_num = 0
while num > 0:
digit = num % 10
reversed_num = reversed_num * 10 + digit
num = num // 10
print("反转后的数字为:", reversed_num)
3.百钱百鸡问题。
百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
for num_cock in range(0, 21): # 公鸡数量范围为0到20
for num_hen in range(0, 34): # 母鸡数量范围为0到33
num_chick = 100 - num_cock - num_hen # 小鸡数量等于总数减去公鸡和母鸡的数量
# 判断是否满足总价为100元的条件
if num_cock * 5 + num_hen * 3 + num_chick / 3 == 100 and num_chick % 3 == 0:
print("公鸡数量:", num_cock)
print("母鸡数量:", num_hen)
print("小鸡数量:", num_chick)
print()
4.CRAPS赌博游戏。
CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。
import random
player_money = 1000 # 玩家的赌注初始金额为1000元
while player_money > 0:
print("玩家当前赌注金额:", player_money)
bet = int(input("请输入赌注金额(输入0结束游戏):"))
if bet == 0:
print("游戏结束。")
break
if bet > player_money:
print("赌注金额超过玩家拥有的金额,请重新输入。")
continue
dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)
first_roll = dice1 + dice2
print("第一次摇骰子点数为:", first_roll)
if first_roll == 7 or first_roll == 11:
print("玩家胜利!")
player_money += bet
elif first_roll == 2 or first_roll == 3 or first_roll == 12:
print("庄家胜利!")
player_money -= bet
else:
while True:
dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)
next_roll = dice1 + dice2
print("继续摇骰子点数为:", next_roll)
if next_roll == first_roll:
print("玩家胜利!")
player_money += bet
break
elif next_roll == 7:
print("庄家胜利!")
player_money -= bet
break
if player_money <= 0:
print("玩家输光了所有的赌注,游戏结束。")
5.生成斐波那契数列的前20个数。
斐波那契数列(Fibonacci sequence),又称黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中提出一个在理想假设条件下兔子成长率的问题而引入的数列,所以这个数列也被戏称为"兔子数列"。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。
fibonacci_sequence = [0, 1] # 斐波那契数列的前两个数
while len(fibonacci_sequence) < 20:
next_number = fibonacci_sequence[-1] + fibonacci_sequence[-2] # 计算下一个斐波那契数
fibonacci_sequence.append(next_number) # 添加到数列中
print(fibonacci_sequence)
6.找出10000以内的完美数。
完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。
perfect_numbers = []
for num in range(1, 10000):
factors = []
for i in range(1, num):
if num % i == 0:
factors.append(i)
if sum(factors) == num:
perfect_numbers.append(num)
print("10000以内的完美数:", perfect_numbers)
7.输出100以内所有的素数。
素数指的是只能被1和自身整除的正整数(不包括1)。
prime_numbers = []
for num in range(2, 101):
is_prime = True
for i in range(2, num):
if num % i == 0:
is_prime = False
break
if is_prime:
prime_numbers.append(num)
print("100以内的素数:", prime_numbers)
优化:一般来说,我们只需要检查一个数是否能被从 2 到它的平方根的范围内的数
整除。
为什么是平方根呢?假设一个数 N 可以被大于它的平方根的数 X 整除,即 N = X * Y。如果 X 大于 N 的平方根 sqrt(N),那么 Y 必然小于 sqrt(N),因为 X * Y = N,所以 Y = N / X。也就是说,如果一个数 N 可以被大于它的平方根的数整除,那么它必定也可以被小于它的平方根的数整除。
因此,通过只检查从 2 到平方根的范围内的数,我们就可以确定一个数是否为素数。如果在这个范围内找不到能整除它的数,那么它就是素数。
使用这种方法,我们可以减少不必要的计算量,提高判断素数的效率。因为在一个数的平方根之后,再出现能整除它的数的概率就会很低了。这样,在判断大数是否为素数时,就能更快地找到答案,节省计算资源。
prime_numbers = []
for num in range(2, 101):
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
prime_numbers.append(num)
print("100以内的素数:", prime_numbers)
我们使用两个嵌套的 for 循环来遍历从2到100的每个数字。对于每个数字,我们检查它是否能被从2到它的平方根(取整数部分)的范围内的任何数字整除。
如果能整除,则该数字不是素数,将 is_prime 设为 False,然后跳出内层循环。如果不能整除,则该数字是素数,将其添加到列表 prime_numbers 中。
最后,我们输出列表 prime_numbers 中存储的100以内的所有素数。
运行代码后,你将得到100以内的所有素数:
100以内的素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Day 5 is over! fighting!