【Python】基础练习题
1)从random库中选取相应的函数,用蒙特卡罗方法(统计实验方法)求解pi。
import randomdef estimate_pi(num_experiments):num_points_in_circle = 0num_total_points = 0for _ in range(num_experiments):x = random.uniform(-1, 1)y = random.uniform(-1, 1)distance = x**2 + y**2if distance <= 1:num_points_in_circle += 1num_total_points += 1pi_estimate = 4 * num_points_in_circle / num_total_pointsreturn pi_estimate# 设置实验次数
num_experiments = 1000000# 估算圆周率
pi_estimate = estimate_pi(num_experiments)
print("蒙特卡罗估算的圆周率: ", pi_estimate)
2)一个笼中共有鸡和兔15只,它们的脚一共有40只,问有多少只鸡?有多少只兔?
def solve_chicken_and_rabbit(total_count, total_legs):# 循环遍历可能的鸡的数量,从0到总数for chicken_count in range(total_count + 1):rabbit_count = total_count - chicken_count# 判断当前的鸡兔数量是否符合脚的总数if (2 * chicken_count + 4 * rabbit_count) == total_legs:return chicken_count, rabbit_count# 如果没有找到符合条件的结果,则返回 Nonereturn None# 输入总数和脚的总数
total_count = 15
total_legs = 40# 解决问题并打印结果
solution = solve_chicken_and_rabbit(total_count, total_legs)
if solution:chicken_count, rabbit_count = solutionprint("鸡的数量:", chicken_count)print("兔子的数量:", rabbit_count)
else:print("无解")
3) “猴子吃桃”问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想吃时, 见只剩一个桃子了。编写程序求第一天猴子共摘了多少个桃子?(1534)
def calculate_total_peaches(days):peaches = 1for _ in range(days):peaches = (peaches + 1) * 2return peaches# 输入天数
days = 9# 求解第一天的桃子数量
total_peaches = calculate_total_peaches(days)
print("第一天猴子共摘了", total_peaches, "个桃子")
4)羊车门问题。有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。靖问:参赛者更换选择后能否增加猜中汽车的机会?请用random库对这个随机事件进行实验,分别输出参赛者改变选择和坚持选择获胜的机率。(进行1000次随机实验,结果以百分制概率输出。近似33.3%,66.6%)
import randomdef simulate_car_goat_game():# 初始化三扇门,其中一扇有汽车,其余有山羊doors = ['car', 'goat', 'goat']# 参赛者随机选择一扇门player_choice = random.choice([0, 1, 2])# 主持人在未选中的门中选择一扇有山羊的门host_choice = random.choice([i for i in range(3) if i != player_choice and doors[i] == 'goat'])# 参赛者更换选择,选择另一扇未被选择过的门player_choice = random.choice([i for i in range(3) if i != player_choice and i != host_choice])# 判断最终参赛者的选择结果if doors[player_choice] == 'car':return 'switch_win' # 参赛者更换选择获胜else:return 'stick_win' # 参赛者坚持选择获胜def calculate_win_probabilities(num_simulations):switch_wins = 0stick_wins = 0for _ in range(num_simulations):result = simulate_car_goat_game()if result == 'switch_win':switch_wins += 1elif result == 'stick_win':stick_wins += 1switch_win_prob = (switch_wins / num_simulations) * 100stick_win_prob = (stick_wins / num_simulations) * 100print("参赛者更换选择获胜的机率:{:.1f}%".format(switch_win_prob))print("参赛者坚持选择获胜的机率:{:.1f}%".format(stick_win_prob))# 进行1000次随机实验
num_simulations = 1000
calculate_win_probabilities(num_simulations)
5)只能由1和它本身整除的整数被称为素数;若一个素数从左向右读与从右向左读是是相同的数,则该素数为回文素数。编程求解2~1000内的所有回文素数
def is_prime(num):if num < 2:return Falsefor i in range(2, int(num**0.5)+1):if num % i == 0:return Falsereturn Truedef is_palindrome(num):return str(num) == str(num)[::-1]palindrome_primes = []for num in range(2, 1001):if is_prime(num) and is_palindrome(num):palindrome_primes.append(num)print("2~1000内的所有回文素数:")
print(palindrome_primes)