两个整数的幂

问题描述

我正在尝试解决有关两个整数的幂的问题。问题描述如下:

给出一个正整数,该正整数适合一个32位带符号整数,找到 如果可以表示为A ^ P,其中P> 1和A>0。A和P都 应该是整数。
示例:
输入:n = 8
输出:true
8可以表示为2 ^ 3

输入:n = 49
输出:true
49可以表示为7 ^ 2

现在,我按照以下方法解决了这个问题。

int Solution::isPower(int A) {
    if(A == 1)
    {
        return true;
    }
    
    for(int x = 2; x <= sqrt(A); x++)
    {
        unsigned long long product = x * x;
        
        while(product <= A && product > 0)
        {
            if(product == A)
            {
                return true;
            }
            
            product = product * x;
        }
    }
    
    return false;
}

但是,我从geeksforgeeks中找到了另一种解决方案,该解决方案仅使用对数除法来确定该值是否可以用两个整数的幂表示。

bool isPower(int a) 
{ 
    if (a == 1) 
        return true; 
  
    for (int i = 2; i * i <= a; i++) { 
        double val = log(a) / log(i); 
        if ((val - (int)val) < 0.00000001) 
            return true; 
    } 
  
    return false; 
} 

有人可以向我解释以上对数解吗?预先感谢。

解决方法

它正在使用数学来解决这个问题。

9=3^2
Log 9 = log 3^2... Adding log at both side
Log 9 = 2 * log 3...using log property
2 = log 9 / log 3

如您所见,最后一条语句等效于代码 double val = log(a)/ log(i);

然后它正在检查Val-round(val)是否为0 ...如果为true,则val为ans,否则它将不为0。对数不给出精确的ans。