# 根据用户输入计算圆周率
import math
import random
def type_judge(pi_type):
"""接收一个字符串为参数,根据参数调用相应函数计算圆周率。 """
if pi_type == '割圆法':
times = int(input()) # 输入一个表示边数量的正整数
return cutting_circle(times) # 调用函数计算圆周率
elif pi_type == '无穷级数法':
threshold = float(input()) # 输入转为浮点数
return leibniz_of_pi(threshold) # 调用函数计算圆周率
elif pi_type == '蒙特卡洛法':
num = int(input()) # 输入转为整数
s = int(input()) # 输入随机数种子
return monte_carlo_pi(num, s) # 调用函数计算圆周率
elif pi_type == '梅钦法':
return machin_of_pi() # 调用函数计算圆周率
elif pi_type == '拉马努金法':
num = int(input()) # 输入转为整数
return ramanujan_of_pi(num)
else:
return f'未找到{pi_type}计算方法'
def cutting_circle(times):
"""参数times为分割次数
π = 周长/(2*圆的半径)得到π的近似值。
# 半径为1的圆内接正6边形边长也是1
# 边长 side_length
# 半径 radius
# 圆周率 pi
# 三角形的高 height
"""
a = 1
n = 6
for i in range(1,times+1):
b = (1-(a/2)**2)**(1/2)
c = 1-b
d = ((a/2)**2+c**2)**(1/2)
a = d
n *= 2
pi = a*n/2
return pi
def leibniz_of_pi(error):
"""接收用户输入的浮点数阈值为参数,用格雷戈里-莱布尼茨级数计算圆周率,返回圆周率值"""
m = 1
n = 1
sum = 0
while 1/n>error:
if m%2 != 0:
sum += 1/n
else:
sum -= 1/n
m += 1
n += 2
pi = sum * 4
return pi
def monte_carlo_pi(num, s):
"""接收一个表示随机次数的整数和一个整数做随机数种子,用蒙特卡洛法计算圆周率,返回一个浮点数"""
random.seed(s)
c=0
for i in range(1,num+1):
x = random.uniform(-1,1)
y = random.uniform(-1,1)
d = x**2+y**2
if d <= 1:
c+=1
pi = c/num*4
return pi
def machin_of_pi():
"""用梅钦级数计算圆周率,返回圆周率值"""
pi = 4*(4*math.atan(1/5)-math.atan(1/239))
return pi
def ramanujan_of_pi(n):
"""接收一个正整数n为参数,用拉马努金公式的前n项计算圆周率并返回。"""
def jc(k):
sum = 1
for i in range(1,k+1):
sum *= i
return sum
sum_1=0
for I in range(0,n):
sum_1 += (jc(4*I)*(1103+26390*I))/(jc(I)**4*396**(4*I))
pi = 1/sum_1*9801/2/2**(1/2)
return pi
if __name__ == '__main__':
type_of_pi = input() # 接收用户输入的字符串
cal_pi = type_judge(type_of_pi) # 调用判断类型的函数
print(cal_pi) # 输出函数运行结果