以下是源代码,它检查数字是否可以用幂表示,但为什么n = 76 ** 89 - 1
和n = 76 ** 89
的代码失败。我该如何解决这个错误?对于这两个n,它给出x=log(n,2)/log(i,2)=89.0
from math import log,sqrt,floor
import sys
n= 76 ** 89 - 1
t=floor(sqrt(n))+1
flag=False
for i in range(2,t):
x=log(n,2)/log(i,2)
print(x)
if x-int(x)<sys.float_info.epsilon:
print("YESSSSSSSSSSSSS!")
flag=True
break
if not flag:
print("Nooooooooooooooooooo!")
答案 0 :(得分:3)
您的代码只能查找候选人,但不会检查他们是否匹配。 浮点不准确使得你无法区分这样一个非常大的值和这个相同的值减一。
但是由于python内置了无限范围的整数artihmetic,你可以检查你找到的东西真的是匹配。
我的想法:一旦找到功率,计算理论数量(通过舍入),然后以整数计算功率,并比较整数。
from math import log,sqrt,floor
import sys
n = 76 ** 89
t=floor(sqrt(n))+1
flag=False
for i in range(2,t):
x=log(n,i) # faster than x=log(n,2)/log(i,2)
if x-int(x)<sys.float_info.epsilon:
x = int(round(x))
r = int(round(n**(1/x)))
print("found candidate: ",x,r)
if n == r**x: # exact integer comparison with initial value & found values
print("YESSSSSSSSSSSSS!")
flag=True
break
else:
print("but not exact")
if not flag:
print("Nooooooooooooooooooo!")
76 ** 89 - 1
值,你会得到&#34;但不准确&#34;因为计算出的功率不匹配n
值。
除此之外:使用x=log(n,i)
代替x=log(n,2)/log(i,2)
速度更快,而且可能更准确,因为涉及的浮动操作较少。