繁体   English   中英

如何在不使用“ /”和“%”的情况下有效地获得商和余数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM