x是我的输入。
我需要找到i,j>=0和n,m>1,例如x = i**m+j**n
现在我已经这么做了,但是速度太慢了!!我该如何改进?
from math import sqrt
import numpy as np
def check(x):
for i in range(1,int(np.ceil(sqrt(x)))):
for j in range(1,int(np.ceil(sqrt(x)))):
for m in range(2,x/2+1):
for n in range(2,x/2+1):
if((pow(i,m) +pow(j,n))==x):
print 'Yes';
return ;
print 'No';
谢谢您!
最佳答案
你可以通过找到所有小于x的幂(i**m)来逆转这个过程,然后你只需检查这些幂中的任何一对是否等于x。
def check(x):
all_powers = set([1]) #add 1 as a special case
#find all powers smaller than x
for base in range(2,int(math.ceil(sqrt(x)))):
exponent = 2;
while pow(base, exponent) < x:
all_powers.add(pow(base, exponent))
exponent+=1
#check if a pair of elements in all_powers adds up to x
for power in all_powers:
if (x - power) in all_powers:
print 'Yes'
return
print 'No'
上面的代码很简单,但是可以进行优化,例如,通过在while循环中集成检查一对是否加起来为x,您可以在大多数情况下提前停止。