我正在解决欧拉计划的第26个问题,需要计算1/n(其中n是1到1000之间的所有整数)的循环部分的长度,并查看哪个数字具有最长的循环部分。这意味着我需要更准确地进行除法运算。因此,我通过更改getContext().prec
来调整我的小数精度,但是增加精度使程序运行速度更快。我使用Python 3.7运行了此程序。以下是代码:
import re
import time
s = time.time()
from decimal import *
getcontext().prec = 500 #This part
recurring = 0
answer = 0
p = re.compile(r"([0-9]+?)\1{3,}")
for i in range(1, 1000):
f = p.search(str(Decimal(1) / Decimal(i))[5:])
if f:
number = f.group(1)
if len(str(number)) > len(str(recurring)):
recurring = number
answer = i
print(answer)
print(time.time() - s)
当我使用精度为500时,这是我的结果:
>>> print(answer)
349
>>> print(time.time() - s)
2.923844575881958
当我使用精度为5000时,得到的结果如下:
>>> print(answer)
983
>>> print(time.time() - s)
0.07812714576721191
我将500和5000进行了交换,这不仅给我带来了正确的答案,因为1/answer的循环部分可能比500更长,而且它也更快。我已经在在线Python解释器上尝试过,也得到了类似的结果。为什么会这样呢?
1.5804040432
,精度为5000时为1.96949100494
。实际答案与您的情况相同。您能告诉我您使用的在线Python解释器是哪一个吗? - Max Kapsecker1.5289030075073242
,983是0.09225702285766602
。@MaxKapsecker 我是在Anaconda安装的Python 3.6上使用Spyder运行的。 - Paritosh Singh349 ~ 1.40679907799
的结果;对于精度为 5000,得到了983 ~ 2.08120393753
的结果。 - duong_dajgja581〜3.19620895386
,对于5000,983〜2.04031896591
。 - Max Kapseckerre.search(r"([a-z]+?)\1{3,}", string.ascii_lowercase*4)
。如果找到匹配项,则速度更快。 - Bernhard