计算圆周率

# 根据用户输入计算圆周率
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)                    # 输出函数运行结果

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十四桥_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值