51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 327|回复: 0
打印 上一主题 下一主题

[python] 使用5种Python计算的圆周率方法

[复制链接]
  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 938 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-3-22 11:56:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     最近一段时间在学习python算法,今天分享5种python计算圆周率的方法:
      1.割圆法,2.无穷级数法, 3.蒙特卡洛法,4 .梅钦法,5. 拉马努金法。
      希望能帮到大家。代码如下:
      1.割圆法
      '''
      编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。
      '''

      import math

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

          ########################End###########################
          return edges, pi

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

          ########################End###########################


      2.无穷级数法
      '''
      使用无穷级数这个公式计算π值,输入一个小数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的π值
      '''


      def leibniz_of_pi(error):
          """接收用户输入的浮点数阈值为参数,返回圆周率值"""
          # ===================Begin====================================
          # 补充你的代码
          a = 1
          b = 1
          sum = 0
          while 1/ b > error:
              if a % 2 != 0:
                  sum += 1 / b
              else:
                  sum -=  1/ b
              a += 1
              b += 2
          pi = sum*4
          return pi
          # =====================End==================================


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


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

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


      4 .梅钦法
      '''
      利用梅钦公式计算圆周率的大小
      '''
      import math
      def machin_of_pi():
          """用梅钦级数计算圆周率,返回圆周率值"""
          #################Begin####################################
          pi  = 4*(4*math.atan(1/5)-math.atan(1/239))

          #################End####################################
          return pi

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


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

      def ramanujan_of_pi(n):
          """接收一个正整数n为参数,用拉马努金公式的前n项计算圆周率并返回。"""
          ################Begin#######################
          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)   

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



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-26 11:50 , Processed in 0.064132 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表