node.js和python中相同问题解决方案的不同结果

问题描述 投票:2回答:2

我用一些代码解决了下面的leetCode问题:


您有d个骰子,每个骰子都有f个面,编号为1,2,...,f。

返回以10 ^ 9 + 7为模的掷骰子的可能方式的数目,因此面朝上的数字之和等于t


我制作了两个版本的解决方案代码,一个使用mathjs在node.js中,一个使用math模块在python中。

在node.js中]

const { combinations: comb, bignumber: Big } = require("mathjs");

function dice(d, f, t) {
    if (t > d * f || t < d) return 0;

    var result = Big(0);
    var i = 0;
    var sign = 1;
    var n = t - 1;
    var k = t - d;

    while (k >= 0 && i <= d) {
        result = result.add(
            comb(Big(d), Big(i))
                .times(comb(Big(n), Big(k)))
                .times(sign)
        );

        i++;
        n -= f;
        k -= f;
        sign *= -1;
    }

    return result;
}

console.log(
    dice(30, 30, 500).mod(
        Big(10)
            .pow(9)
            .add(7)
    )
);

在python中:

import math


def dice(d, f, t):
    if t > d * f or t < d:
        return 0

    result = 0
    i = 0
    sign = 1
    n = t - 1
    k = t - d

    while k >= 0 and i <= d:
        result += math.comb(d, i) * math.comb(n, k) * sign
        i += 1
        n -= f
        k -= f
        sign *= -1

    return result


print(dice(30, 30, 500) % (math.pow(10, 9) + 7))


现在,当我使用以下参数运行代码时:d = 30f= 30t= 500(每个版本的代码的最后一行),我希望结果为222616187。] >

在node.js版本中,这正是我得到的。

但是在python版本中,我得到811448245.0我不知道为什么会这样。

所以结果为何有所不同?

我用一些代码解决了下面的leetCode问题:您有d个骰子,每个骰子都有f个面,编号为1、2,...,f。返回以模数10 ^ 9 + 7掷骰子的可能方式的数目,因此...

javascript python combinatorics bignum arbitrary-precision
2个回答
3
投票

math模块使用float,而不是任意精度int

math - Mathematical functions


2
投票

以一种奇怪的方式解决。事实证明,math.pow返回一个float而不是int并以某种方式出错。我认为int%float中具有不同的强制转换操作,并且编译器对其进行了不同的处理。可以进一步调查。如果将其强制转换为int,那将是您的答案。

© www.soinside.com 2019 - 2024. All rights reserved.