我正在研究一个问题,该问题检查数字是否可以表示为完美幂。有正整数可用的解决方案。我将其微调以检查负整数。如何进一步调整以测试十进制数字(例如0.008或49.49)?
// Returns true if n can be written as x^y
bool isPower(int n)
{
if(n<0){
for (int x=-2; x>=n; x--)
{
int p = x;
while (p >= n)
{
p *= x;
if (p == n)
return true;
}
} }
if(n > 0)
{
for (int x=2; x<=sqrt(n); x++)
{
int p = x;
while (p <= n)
{
p *= x;
if (p == n)
return true;
}
}
}
return false;
}
答案 0 :(得分:0)
如果您将研究限于有理数,即p/q
的形式为p
和q
整数,则可能有解决方案。
尝试对非有理数进行运算没有实际意义。例如,2
是2^1/2
的幂。
第一步是以这种合理的形式表示您的数字,例如0.008 = 8/1000
或0.09 = 9/100
。最有效的方法是使用连续分数。您可以在SO网站上找到有关该主题的几篇文章。如果效率不是一个大问题,您可以使用简单的for
循环来找到这种合理的表示形式。但是,请注意引入余量,要考虑到舍入误差或数字表示误差。 0.1111111
仅近似等于1/9
。对于以下内容,p
和q
是相对质数也很重要。使用连续分数法可以确保这一点。
在那之后,您只需要对分母和分母部分的整数使用方法。如果每个人的权力相同,那么可以肯定地得出结论。
例如0.008 = 8/1000 = 2^3/10^3 = (2/10)^3 = 0.2^3
或0.09 = 9/100 = 3^2/10^2 = (3/10)^2 = 0.3^2
注意:另一种方法是使用p
和q
的素分解。