[英]How to get the quotient and remainder effectively without using “/” and “%”?
我实现了一个简单的函数,当除数为10
的幂时会返回商和余数:
func getQuotientAndRemainder(num int64, digits uint) (int64, int64) {
divisor := int64(math.Pow(10, float64(digits)))
if num >= divisor {
return num / divisor, num % divisor
} else {
return 0, num
}
}
只是好奇,除了直接使用/
和%
运算符外,还有没有更好的算法来获得商和余数? 或仅在除数为10
的幂的情况下?
return num / divisor, num % divisor
“算法”是合理的,并且可以说是最好的表达方式:表现力。 如果有的话,这部分代码可能过于复杂:
int64(math.Pow(10, float64(digits)))
可以说,与float64
转换不是最优的。 同样,10等于18的幂将溢出int64
。 我建议您添加一个健全性检查,并用一个乘法循环替换代码并衡量其性能。
但是然后:如果您要关注性能,则只需在组装中实施即可。
显然,您应该运行一些Go基准测试: 基准测试,程序包测试 。
您的解决方案看起来效率不高。 尝试这个:
package main
import "fmt"
func pow(base, exp int64) int64 {
p := int64(1)
for exp > 0 {
if exp&1 != 0 {
p *= base
}
exp >>= 1
base *= base
}
return p
}
func divPow(n, base, exp int64) (q int64, r int64) {
p := pow(base, exp)
q = n / p
r = n - q*p
return q, r
}
func main() {
fmt.Println(divPow(42, 10, 1))
fmt.Println(divPow(-42, 10, 1))
}
输出:
4 2
-4 -2
基准测试:
BenchmarkDivPow 20000000 77.4 ns/op
BenchmarkGetQuotientAndRemainder 5000000 296 ns/op
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.