2 回答

TA貢獻(xiàn)1805條經(jīng)驗 獲得超10個贊
我們可以使用對數(shù)以簡單的方式做到這一點。它如下:
x = b^p log(base b)x = p log x/log b = p
所以我們可以通過 x 迭代 b = 2 并檢查 p 是否是一個完美的整數(shù)并返回值。對于十進(jìn)制情況,我們可以進(jìn)一步調(diào)整日志公式。
log b = (log x)/p Hence b = 10^(log x)/p)
在每次迭代中,我們可以檢查是否 b^p = x 以及是否返回 p。我解決了這個問題,假設(shè) p 應(yīng)該是一個整數(shù)。然而,對于 p 可以是十進(jìn)制而 x 在 0 到 1 之間的情況,這個解決方案應(yīng)該進(jìn)一步調(diào)整。下面是我在 Scala 中實現(xiàn)的代碼。
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貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊
由于 45 487.875 515 548 84(以此為例)不是整數(shù),所以它可以表示為 b ^ p 其中 b 和 p 是整數(shù)的唯一方法是如果 p 是負(fù)數(shù)。也就是說,您的數(shù)字可能是某個(大)整數(shù)的平方根、立方根、四次根等。
第一個問題是精度問題。您的數(shù)字無法用 Java 雙精度精確表示。您可以使用BigDecimal
. 它也不能恰好是某個整數(shù)的某個根,因此您必須決定接受的容差。
據(jù)我所知,你的大問題是可能的 p 值的范圍是無限的。甚至可能所有數(shù)字都足夠接近某個(大)整數(shù)的第 p 個根,而您無法合理區(qū)分;我不知道,這肯定取決于你的容忍度。
我認(rèn)為您可以嘗試的最好方法是將您的數(shù)字提高到 2、3、4 等,然后看看您何時接近整數(shù)。如果您的 q 次冪足夠接近整數(shù),則返回 -q 作為您的 p。在你失去耐心之前停止搜索。:-)
添加回答
舉報