最近一段时间在学习python算法,今天分享5种python计算圆周率的方法:
1.割圆法,2.无穷级数法, 3.蒙特卡洛法,4 .梅钦法,5. 拉马努金法
题目来自头歌习题,希望能帮到大家。代码如下:
1.割圆法
'''编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。'''import mathdef 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 *=2pi = side_length*edges/2########################End###########################return edges, piif __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 = 1b = 1sum = 0while 1/ b > error:if a % 2 != 0:sum += 1 / belse:sum -=1/ ba += 1b += 2pi = sum*4return pi# =====================End==================================if __name__ == '__main__':threshold = float(input())print("{:.8f}".format(leibniz_of_pi(threshold)))# 保留小数点后八位
3.蒙特卡洛法
import randomdef monte_carlo_pi(num):"""接收正整数为参数,表示随机点的数量,利用蒙特卡洛方法计算圆周率返回值为表示圆周率的浮点数"""#====================Begin===================================# 补充你的代码a = 0count = 0while a < times:x, y = random.uniform(-1, 1), random.uniform(-1, 1)if x**2 + y**2 <=1:count += 1a +=1return 4*count / a #=====================End==================================if __name__ == '__main__':sd = int(input()) #读入随机数种子random.seed(sd) #设置随机数种子times = int(input())# 输入正整数,表示产生点数量print(monte_carlo_pi(times))# 输出圆周率值,浮点数
4 .梅钦法
'''利用梅钦公式计算圆周率的大小'''import mathdef 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 mathdef ramanujan_of_pi(n):"""接收一个正整数n为参数,用拉马努金公式的前n项计算圆周率并返回。"""################Begin#######################def sumk (k):s =1for i in range(1,k+1):s *= ireturn sa = 0for 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 piif __name__ == '__main__':n = int(input())cal_pi = ramanujan_of_pi(n)print(cal_pi)# 输出函数运行结果
在你还没成功之前,没人会对你的努力感兴趣,累了可以休息,但不要放弃,今天不行明天再来,你的坚持一定很酷,希望你所盼望的,终究会到来。