Go语言 返回商和余数的除法

shstlldc  于 2022-12-31  发布在  Go
关注(0)|答案(5)|浏览(273)

我试着从Python迁移到Golang。我目前正在研究一些数学运算,并想知道如何用除法的结果同时得到商和余数。我将在下面分享一个等价的Python代码。

hours, remainder = divmod(5566, 3600)
minutes, seconds = divmod(remainder, 60)
print('%s:%s' % (minutes, seconds))
# 32:46

以上就是我的目标。谢谢。

5sxhfpxr

5sxhfpxr1#

整数除法加模数可以实现这一点。

func divmod(numerator, denominator int64) (quotient, remainder int64) {
    quotient = numerator / denominator // integer division, decimals are truncated
    remainder = numerator % denominator
    return
}

https://play.golang.org/p/rimqraYE2B
编辑:定义
在整数除法的上下文中,Quotientwhole 乘以分子进入分母的数目。换句话说,它与decimal语句相同:第一个月

Modulo给出了这样一个除法的 * 余数 *。分子和分母的模总是介于0和d-1之间(其中d是分母)

5gfr0r5j

5gfr0r5j2#

如果需要一行程序,

quotient, remainder := numerator/denominator, numerator%denominator
wqnecbli

wqnecbli3#

如果您有一个32位的数字,您可以使用以下之一:

package main
import "math/bits"

func main() {
   { // example 1
      var n uint = 4294967295
      q, r := bits.Div(0, n, 2)
      println(q == n / 2, r == 1)
   }
   { // example 2
      var n uint32 = 4294967295
      q, r := bits.Div32(0, n, 2)
      println(q == n / 2, r == 1)
   }
}

如果你有一个64位的数字,你可以这样做:

package main
import "math/bits"

func main() {
   var n uint64 = 18446744073709551615
   q, r := bits.Div64(0, n, 2)
   println(q == n / 2, r == 1)
}

如果您有大于64位的内容,您可以这样做:

package main
import "math/bits"

func main() {
   q, r := bits.Div64(1, 0, 2)
   println(q == 9223372036854775808, r == 0)
}
  • https://golang.org/pkg/math/bits#Div
  • https://golang.org/pkg/math/bits#Div32
  • https://golang.org/pkg/math/bits#Div64
cwtwac6a

cwtwac6a4#

我做了这个功能,也许这就是你要找的。

//QuotientAndRemainderF32 Computes the integer quotient and the remainder of the inputs. This function rounds floor(x/y) to the nearest integer towards -inf.
func QuotientAndRemainderF32(x, y float32) (Remainder, Quotient float32) {
    Quotient = float32(math.Floor(float64(x / y)))
    Remainder = x - y*Quotient
    return Remainder, Quotient
}
gc0ot86w

gc0ot86w5#

我认为这个问题并不清楚:您是在寻找与Python divmod等效的函数,还是仅仅是一个返回商和余数的函数?
这些解决方案并不等同于Python divmod,因为它们返回的是余数而不是模数,因此,它们对负数的处理方式不同。
在Python中,divmod(-7, 4)返回-2, 1,这里的答案返回-1, 3
我的建议是

func DivMod(n, d int64) (q, r int64) {
    q = n / d
    r = n % d

    // the numerator or the denominator is negarive (but not both)
    if r != 0 && n*d < 0 {
        q--
        r += d
    }
    return
}

相关问题