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,您可以在大多数情况下提前停止。

07-28 03:08
查看更多