我用一些代码解决了下面的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掷骰子的可能方式的数目,因此...
math
模块使用float
,而不是任意精度int
。
以一种奇怪的方式解决。事实证明,math.pow返回一个float而不是int并以某种方式出错。我认为int%float中具有不同的强制转换操作,并且编译器对其进行了不同的处理。可以进一步调查。如果将其强制转换为int,那将是您的答案。