把一个数除以两次幂之和

2024-04-26 05:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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';

谢谢你!在


Tags: 方法infromimportgtnumpyfornp
3条回答

这里不时会出现一个问题,关于确定一个正整数是否是另一个正整数的整数幂。一、 给定正整数z求正整数j和{},使z == j**n。这可以在时间复杂度O(log(z))中完成,因此速度相当快。在

所以找到或开发这样一个例程:调用它is_a_power(z),如果z(0, 0)的幂,则返回一个元组(j, n)。然后循环i和{},然后检查x - i**m是否为幂。当它成为一体,你就完蛋了。在

我让你从这里完成代码,除了一个指针。给定xi,其中i > 1,你可以找到m的上限,这样i**m <= x

m <= log(x) / log(i)

注意,i == 1是一个特殊情况,因为在这种情况下,i**m实际上并不依赖于{}。在

你可以通过找到所有小于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,在大多数情况下可以提前停止。在

from math import sqrt
import numpy as np
def build(x):
# this function creates number that are in form of
# a^b such that a^b <= x and b>1
  sq=sqrt(x);
  dict[1]:1; # 1 is always obtainable
  dict[0]:1; # also 0 is always obtainable
  for i in range(1,sq): # try the base
    number=i*i; # firstly our number is i^2
    while number<=x: 
      dict[number]:1; # this number is in form of a^b
      number*=i; # increase power of the number
def check(x):
  sq=sqrt(x);
  for i in range(1,sq): # we will try base of the first number
    firstnumber=1;
    while firstnumber<=x: # we are trying powers of i
      remaining=x-firstnumber; # this number is remaining number when we substract firstnumber from x
      if dict[remaining]==1: # if remaining number is in dictionary which means it is representable as a^b
        print("YES");  # then print YES
        return ;
      firstnumber*=i; # increase the power of the base
  print("NO");
  return ;

上面的代码在O(sqrt(x)*log(x)*log(x))中工作,速度更快。在

您可以阅读代码中的注释来理解它。在

相关问题 更多 >

    热门问题