我们先导入alive_progress库
from alive_progress import alive_bar
然后是计算圆周率的核心部分。我用的是马青公式,具体可以自己在网上查找
'''算法根据马青公式计算圆周率'''
num = 10000 # 计算小数点后的多少位
# 多计算10位,防止尾数取舍的影响
number1 = num + 10
# 算到小数点后number1位
b = 10 ** number1
# 求含4/5的首项
x1 = b * 4 // 5
# 求含1/239的首项
x2 = b // -239
# 求第一大项
he = x1 + x2
# 设置下面循环的终点,即共计算n项
number = num * 2
k = 0
j = number / 2 - 1
# 循环初值=3,末值2n,步长=2
for i in range(3, number, 2):
# 求每个含1/5的项及符号
x1 = x1 // -25
# 求每个含1/239的项及符号
x2 //= -57121
# 求两项之和
x = (x1 + x2) // i
# 求总和10
he += x
# 求出π
pai = he * 4
# 舍掉后十位
pai //= 10 ** 10
paistring = str(pai)
result = f'{paistring[0]}.{paistring[1:len(paistring)]}'
print(f'{result}')
最后在19行添加alive_progress的进度条,再加个重复执行即可
with alive_bar(len(range(3, number, 2))) as bar:
# 循环初值=3,末值2n,步长=2
for i in range(3, number, 2):
# 求每个含1/5的项及符号
x1 = x1 // -25
# 求每个含1/239的项及符号
x2 //= -57121
# 求两项之和
x = (x1 + x2) // i
# 求总和10
he += x
bar()
完整代码:
from alive_progress import alive_bar
while True:
'''算法根据马青公式计算圆周率'''
num = int(input('请输入想要计算到小数点后的位数:'))
# 多计算10位,防止尾数取舍的影响
number1 = num + 10
# 算到小数点后number1位
b = 10 ** number1
# 求含4/5的首项
x1 = b * 4 // 5
# 求含1/239的首项
x2 = b // -239
# 求第一大项
he = x1 + x2
# 设置下面循环的终点,即共计算n项
number = num * 2
k = 0
j = number / 2 - 1
with alive_bar(len(range(3, number, 2))) as bar:
# 循环初值=3,末值2n,步长=2
for i in range(3, number, 2):
# 求每个含1/5的项及符号
x1 = x1 // -25
# 求每个含1/239的项及符号
x2 //= -57121
# 求两项之和
x = (x1 + x2) // i
# 求总和10
he += x
bar()
# 求出π的值
pai = he * 4
# 舍掉后十位
pai //= 10 ** 10
# 输出圆周率π的值
paistring = str(pai)
result = f'{paistring[0]}.{paistring[1:len(paistring)]}'
# 进行格式化输出
print(f'{result}')
print('-'*100) # 分割线