Update 0483 solution

This commit is contained in:
YDZ
2021-06-17 21:21:21 +08:00
parent 555737bcff
commit 7a90f3713d
2 changed files with 26 additions and 47 deletions

View File

@ -2,34 +2,23 @@ package leetcode
import ( import (
"math" "math"
"math/bits"
"strconv" "strconv"
) )
func smallestGoodBase(n string) string { func smallestGoodBase(n string) string {
num, _ := strconv.ParseUint(n, 10, 64) nVal, _ := strconv.Atoi(n)
for bit := uint64(math.Log2(float64(num))); bit >= 1; bit-- { mMax := bits.Len(uint(nVal)) - 1
low, high := uint64(2), uint64(math.Pow(float64(num), 1.0/float64(bit))) for m := mMax; m > 1; m-- {
for low < high { k := int(math.Pow(float64(nVal), 1/float64(m)))
mid := uint64(low + (high-low)>>1) mul, sum := 1, 1
sum := findBase(mid, bit) for i := 0; i < m; i++ {
if sum == num { mul *= k
return strconv.FormatUint(mid, 10) sum += mul
} else if sum > num { }
high = mid - 1 if sum == nVal {
} else { return strconv.Itoa(k)
low = mid + 1
} }
} }
} return strconv.Itoa(nVal - 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
} }

View File

@ -104,37 +104,27 @@ package leetcode
import ( import (
"math" "math"
"math/bits"
"strconv" "strconv"
) )
func smallestGoodBase(n string) string { func smallestGoodBase(n string) string {
num, _ := strconv.ParseUint(n, 10, 64) nVal, _ := strconv.Atoi(n)
for bit := uint64(math.Log2(float64(num))); bit >= 1; bit-- { mMax := bits.Len(uint(nVal)) - 1
low, high := uint64(2), uint64(math.Pow(float64(num), 1.0/float64(bit))) for m := mMax; m > 1; m-- {
for low < high { k := int(math.Pow(float64(nVal), 1/float64(m)))
mid := uint64(low + (high-low)>>1) mul, sum := 1, 1
sum := findBase(mid, bit) for i := 0; i < m; i++ {
if sum == num { mul *= k
return strconv.FormatUint(mid, 10) sum += mul
} else if sum > num { }
high = mid - 1 if sum == nVal {
} else { return strconv.Itoa(k)
low = mid + 1
} }
} }
} return strconv.Itoa(nVal - 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
}
``` ```