湖北师范大学-Python程序设计-3.3 计算圆周率(project)

第1关:割圆法

编程要求
根据提示,在右侧编辑区补充代码,编程实现割圆法计算圆周率,输出在正六边形基础上分割n次时得到多边形的边数、圆周率值以及math库中的圆周率值。

测试说明
平台会对你编写的代码进行测试:

输入格式
输入为一行,一个正整数n ,表示在内接正六边形的基础上割圆的次数。

输出格式
输出为两行,第一行输出在内接正六边形基础上再次分隔n次,分隔得到的正多边形的边数m,以及割圆法计算得到的圆周率pi(保留六位小数);第二行输出math库里的pi值(保留六位小数)。
具体输出格式见示例。

示例
输入:
4
输出:
分割4次,边数为96,圆周率为3.141032
math库中的圆周率常量值为3.141593

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

import math

def cutting_circle(n):      # n为分割次数
    """接收表示分割次数的整数n为参数,计算分割n次时正多边形的边数和圆周率值,返回边数和圆周率值"""
    side_length = 1  # 初始边长
    edges = 6  # 初始边数
    # 补充你的代码
    #######################Begin############################
    # 补充你的代码
    edges=edges*(2**n) #分割后的边数
    
    def length(x):
       h=math.sqrt(1-(x/2)**2)
       CD=1-h
       AD=math.sqrt((x/2)**2 + CD**2)
       return AD
    for i in range(n):
        side_length=length(side_length)
        pi=side_length*edges/2
   
   
    #print(f"边长为{side}")
########################End###########################

    return edges, pi

if __name__ == '__main__':
    times = int(input())          # 割圆次数
    # 补充你的代码
                                   # 圆周率
     #######################Begin############################
    # 补充你的代码
    edges,pi=cutting_circle(times)
    print(f'分割{times}次,边数为{edges},圆周率为{pi:.6f}')
    print(f'math库中的圆周率常量值为{math.pi:.6f}')
 
    ########################End###########################

第2关:无穷级数法

编程要求
根据提示,在右侧编辑区补充代码,编程用莱布尼茨级数计算 π值。输入一个较小的数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的 π 值。

测试说明
平台会对你编写的代码进行测试:
输入格式
输入为一行,一个正浮点数 threshold,用以限定级数法求解 pi 值时,迭代累加只加绝对值大于 threshold 的项。

输出格式
输出为一个浮点数,是程序使用级数法求解的 pi 值,要求保留小数点后八位。

输入输出示例
示例 1

输入:
0.000002
输出:
3.14158865

示例 2

输入:
1e-6
输出:
3.14159065

'''
使用无穷级数这个公式计算π值,输入一个小数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的π值
'''
def leibniz_of_pi(error):
    """接收用户输入的浮点数阈值为参数,返回圆周率值"""
    # 补充你的代码
    x=3
    f=1
    s=1
    while (1/x) > error:
        if f==1:
            s=s-(1/x)
            f=0
            x=x+2
        else:
            s=s+(1/x)
            f=1
            x=x+2
    
    return s*4


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

第3关:蒙特卡洛法

编程要求
根据提示,在右侧编辑器补充代码,编程实现用蒙特卡洛方法计算π值,为了自动测评的需要,请先读入一个正整数sd作为随机数种子,并要求使用下面语句来生成随机点的坐标值:
x, y = random.uniform(-1, 1), random.uniform(-1, 1)

测试说明
平台会对你编写的代码进行测试:

** 示例 **
输入:
100
100000
输出:
3.15316

import random

def monte_carlo_pi(num):
    """接收正整数为参数,表示随机点的数量,利用蒙特卡洛方法计算圆周率
    返回值为表示圆周率的浮点数"""
    # 补充你的代码
    num1=0
    for i in range(num):
        x,y=random.uniform(-1,1),random.uniform(-1,1)
        if x**2+y**2 < 1:
            num1=num1+1
    pi=num1/num*4
    return pi


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

第4关:梅钦法

任务描述
本关任务:编写一个梅钦公式计算圆周率大小的小程序。

相关知识
为了完成本关任务,你需要掌握:

梅钦公式
梅钦公式
1706 年,英国人 约翰·梅钦( John Machin) 发明了一个用于计算π / 4值的公式:

梅钦公式是格里高利/莱布尼茨计算的公式的变体,但是更实用,它的收敛速度显著增加,这使得它成为了更实用的计算的方法,虽然有若干种类梅钦(Machin-like)公式,但梅钦公式仍然是计算值的主要公式。

编程要求
根据提示,在右侧编辑器补充代码,计算并输出圆周率的大小。

测试说明
平台会对你编写的代码进行测试:

输入:

输出:
3.1415926535897936

'''
利用梅钦公式计算圆周率的大小
'''
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关:拉马努金法

编程要求
根据提示,在右侧编辑器补充代码,调用math库中的阶乘函数计算并输出圆周率的大小。

测试说明
平台会对你编写的代码进行测试:

测试输入:
1
预期输出:
3.1415927300133055

'''
输入一个正整数n,使用拉马努金法公式计算思加n次时的圆周率值。
'''
import math


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



    return pi


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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值