mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 08:27:30 +08:00
36 lines
734 B
Go
36 lines
734 B
Go
package leetcode
|
|
|
|
import (
|
|
"math"
|
|
"strconv"
|
|
)
|
|
|
|
func smallestGoodBase(n string) string {
|
|
num, _ := strconv.ParseUint(n, 10, 64)
|
|
for bit := uint64(math.Log2(float64(num))); bit >= 1; bit-- {
|
|
low, high := uint64(2), uint64(math.Pow(float64(num), 1.0/float64(bit)))
|
|
for low < high {
|
|
mid := uint64(low + (high-low)>>1)
|
|
sum := findBase(mid, bit)
|
|
if sum == num {
|
|
return strconv.FormatUint(mid, 10)
|
|
} else if sum > num {
|
|
high = mid - 1
|
|
} else {
|
|
low = mid + 1
|
|
}
|
|
}
|
|
}
|
|
return strconv.FormatUint(num-1, 10)
|
|
}
|
|
|
|
// 计算 k^m + k^(m-1) + ... + k + 1
|
|
func findBase(mid, bit uint64) uint64 {
|
|
sum, base := uint64(1), uint64(1)
|
|
for i := uint64(1); i <= bit; i++ {
|
|
base *= mid
|
|
sum += base
|
|
}
|
|
return sum
|
|
}
|