2 回答
TA贡献1805条经验 获得超10个赞
我们可以使用对数以简单的方式做到这一点。它如下:
x = b^p log(base b)x = p log x/log b = p
所以我们可以通过 x 迭代 b = 2 并检查 p 是否是一个完美的整数并返回值。对于十进制情况,我们可以进一步调整日志公式。
log b = (log x)/p Hence b = 10^(log x)/p)
在每次迭代中,我们可以检查是否 b^p = x 以及是否返回 p。我解决了这个问题,假设 p 应该是一个整数。然而,对于 p 可以是十进制而 x 在 0 到 1 之间的情况,这个解决方案应该进一步调整。下面是我在 Scala 中实现的代码。
def perfectpowerlog(x: Double): Double = {
var i: Double = 2
var n: Double = 1
var p: Double = 0
val loop = new Breaks
if (x == 1) {
return n
}
if (x.ceil == x) {
loop.breakable {
while (i<=x) {
p = math.log(x)/math.log(i)
if (p.toInt == p) {
n = p
loop.break()
}
else
i=i+1
}
}
}
else {
loop.breakable {
while(i<=x.ceil) {
p = pow(10,(log10(x)/i))
if(pow(p,i) == x) {
n = i
loop.break()
}
else
i = i+1
}
}
}
return n
}
TA贡献1854条经验 获得超8个赞
由于 45 487.875 515 548 84(以此为例)不是整数,所以它可以表示为 b ^ p 其中 b 和 p 是整数的唯一方法是如果 p 是负数。也就是说,您的数字可能是某个(大)整数的平方根、立方根、四次根等。
第一个问题是精度问题。您的数字无法用 Java 双精度精确表示。您可以使用BigDecimal
. 它也不能恰好是某个整数的某个根,因此您必须决定接受的容差。
据我所知,你的大问题是可能的 p 值的范围是无限的。甚至可能所有数字都足够接近某个(大)整数的第 p 个根,而您无法合理区分;我不知道,这肯定取决于你的容忍度。
我认为您可以尝试的最好方法是将您的数字提高到 2、3、4 等,然后看看您何时接近整数。如果您的 q 次幂足够接近整数,则返回 -q 作为您的 p。在你失去耐心之前停止搜索。:-)
添加回答
举报