用户:
SunshineCode查看:0 回复:0 评论:0 创建时间:2019-07-01T21:41:47
本人(SunshineCode)原创Python作品
话不多说直接上代码
##############【SunshineCode原创】Python马青公式计算圆周率##############
#本作品作为本人同创未来的参赛作品之一。
#马青公式: π = 16 arctan(1/5) - 4 arctan(1/239)
#arctan是反正切,又可写作arctg。
#反正切公式(泰勒级数):arctan x = x - 1/3 x^3 + 1/5 x^5 - 1/7 x^7 + 1/9 x^9 - ...
#导入时间库。后面要用到时间间隔。
import time
######## 定义函数arctan x ########
def arctan(x,pr,im):
xi = 0
for i in range(1,im,4):
xi += (pr / (i * x ** i))
xi -= (pr / ((i + 2) * x ** (i + 2)))
return xi
########程序主体########
#声明及注意事项
print('######马青公式计算圆周率程序######')
#这里以及程序头下面的等待是为了让用户注意到这些
time.sleep(0.1)
#SunshineCode原创,请勿盗版
print('########SunshineCode 原创########')
time.sleep(0.1)
print('#运用此程序,一般台式机可以在一秒以内将圆周率轻松计算到小数点后1000位。')
time.sleep(0.1)
#其实输入10000以上的位数也是可以的,只不过计算速度较慢,容易卡
print('#注意:如果你的电脑不是高端机,请勿输入10000以上的位数,否则电脑会吃不消,至少会很慢。')
time.sleep(0.1)
print('#若不小心输入了太大的位数,或者不想等待计算,请强制退出浏览器。')
time.sleep(0.1)
#出现这个bug的原因是网页版海龟编辑器不稳定
print('#本程序计算圆周率9~15位时会有bug,请不要输入这些位数。')
time.sleep(0.5)
#在本地编辑器中以及正规Python中,程序只能保存带有299个位数的变量,除去“3.”就是297位了
print('#请在网页版海龟编辑器中运行此程序,否则只能计算297位。')
time.sleep(0.5)
print('---------------------------')
print('| 请认真阅读上面的注意事项。|')
print('---------------------------')
time.sleep(2)
#重复执行是为了让计算程序不断工作,而不用计算一次就点一次运行
while 1:
#分隔线,隔离每次运算的输出
print('—————————————————————————————————————')
#inp是记录输入位数的变量
inp = int(input('计算到小数点后的位数?'))
print('开始计算')
#注:从这里以后的所有计算进度百分比只是一个大概的值,并不很准确
#输出计算进度是为了让用户不觉得这个程序太卡
print('数据正在初始化...1%')
#这里等待10e-1秒,这个时间间隔是很小的,但这能让Python停顿一会儿,让它有足够的时间输出
#计算进度。可以试一下,如果把这些时间间隔删掉,程序中的所有要输出的计算进度都会在计算
#完毕后的同一时间全部输出。因此这个时间等待不是无缘无故加上去的。
time.sleep(1e-10)
#inp_10这个变量无比重要。这里要多啰嗦一下,这个程序的原理是Python不会舍入变量中的任何
#一个整位数。运行程序可以发现,输出的结果是没有小数点的,比如计算小数点后七位,输出的
#就是一个数位为千万位的整数。这个变量是被除数,就是说这个被除数的位数就是要计算的位数。
#这里加上10,是为了防止计算过程中末尾取整。
inp_10 = (10 ** (inp + 10))
print('数据初始化完毕...6%')
print('正在计算16arctan1/5')
time.sleep(1e-10)
#计算16arctan(1/5)
arctan_16_1_5 = (16 * arctan(5, inp_10, 6 + int((inp * 1.45))))
print('16arctan1/5已计算完成...70%')
print('正在计算4arctan1/239')
time.sleep(1e-10)
#计算16arctan(1/239)
arctan_4_1_239 = (4 * arctan(239, inp_10, 6 + int((inp / 2.3))))
print('4arctan1/239已计算完成...98%')
print('Pi值计算完成,正在输出pi值')
time.sleep(1e-10)
#输出π值。这里要除以这么多,是为了舍去前面多计算的10位,而后int会将结果取整。
print(int(((arctan_16_1_5 - arctan_4_1_239) / 喵)))
print('Pi值已输出完毕,进入下次运算。...100%')