第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
import math

"""
编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。
"""


def cutting_circle(n): # n为分割次数
"""接收表示分割次数的整数n为参数,计算分割n次时正多边形的边数和圆周率值,返回边数和圆周率值"""
side_length = 1 # 初始边长
edges = 6 # 初始边数

for i in range(n):
edges *= 2
side_length = math.sqrt(2 - 2 * math.sqrt(1 - (side_length / 2) ** 2))

pi = (edges * side_length) / 2

return edges, pi


if __name__ == "__main__":
times = int(input()) # 割圆次数

edges, pi = cutting_circle(times)
print(f"分割{times}次,边数为{edges},圆周率为{pi:.6f}")
print(f"math库中的圆周率常量值为{math.pi:.6f}")

第2关:无穷级数法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""
使用无穷级数这个公式计算π值,输入一个小数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的π值
"""


def leibniz_of_pi(error):
"""接收用户输入的浮点数阈值为参数,返回圆周率值"""
pi = 0
n = 0
term = 1

while abs(term) >= error:
pi += term
n += 1
term = (-1) ** n / (2 * n + 1)

return 4 * pi


if __name__ == "__main__":
threshold = float(input())
print("{:.8f}".format(leibniz_of_pi(threshold))) # 保留小数点后八位

第3关:蒙特卡洛法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import random

def monte_carlo_pi(num):
count = 0 # 计数器,用于记录落在圆内的点的数量

for _ in range(num):
x = random.uniform(-1, 1) # 在正方形内随机生成 x 坐标
y = random.uniform(-1, 1) # 在正方形内随机生成 y 坐标

if x**2 + y**2 <= 1: # 判断点是否落在圆内
count += 1

# 计算圆周率的估计值
pi = 4 * count / num
return pi

if __name__ == '__main__':
sd = int(input()) # 读入随机数种子
random.seed(sd) # 设置随机数种子
times = int(input()) # 输入正整数,表示产生点数量
print(monte_carlo_pi(times)) # 输出圆周率值,浮点数

第4关:梅钦法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'''
利用梅钦公式计算圆周率的大小
'''
import math


def machin_of_pi():
"""用梅钦级数计算圆周率,返回圆周率值"""
# 补充你的代码
pi = 4 * (4 * math.atan(1/5) - math.atan(1/239))


return pi

if __name__ == '__main__':
cal_pi = machin_of_pi() # 调用判断类型的函数
print(cal_pi) # 输出函数运行结果

第5关:拉马努金法

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
"""
输入一个正整数n,使用拉马努金法公式计算思加n次时的圆周率值。
"""

import math


def ramanujan_of_pi(n):
"""接收一个正整数n为参数,用拉马努金公式的前n项计算圆周率并返回。"""
# 补充你的代码
pi = 0
for k in range(n):
numerator = math.factorial(4 * k) * (1103 + 26390 * k)
denominator = math.factorial(k) ** 4 * 396 ** (4 * k)
pi += numerator / denominator
pi *= 2 * math.sqrt(2) / 9801
pi = 1 / pi

return pi


if __name__ == "__main__":
n = int(input())
cal_pi = ramanujan_of_pi(n)
print(cal_pi) # 输出函数运行结果