... 最好是 java 语。以下是我所拥有的:
//x choose y
public static double choose(int x, int y) {
if (y < 0 || y > x) return 0;
if (y == 0 || y == x) return 1;
double answer = 1;
for (int i = x-y+1; i <= x; i++) {
answer = answer * i;
}
for (int j = y; j > 1; j--) {
answer = answer / j;
}
return answer;
}
我想知道有没有更好的办法?
6条答案
按热度按时间8fq7wneg1#
此版本不需要
BigInteger
或浮点运算,并且对所有对象都没有溢出错误n
不到62。62比28是导致溢出的第一对。以下测试证明这是正确的:
8yparm6h2#
对于
n/((r!)(n-r)!)
使用此(伪代码)
1l5u6lss3#
你正在处理的数字将变得相当大,很快就会超过
double
价值观,给你意想不到的错误结果。因此,您可能需要考虑任意精度的解决方案,例如使用java.math.BigInteger
,不会出现这个问题。zujrkrfu4#
老实说,我看你的情况很清楚。诚然,我会把return语句放在大括号里,因为这是我遵循的惯例,但除此之外,它看起来和它得到的一样好。
我想我可能会颠倒第二个循环的顺序,这样两个循环都是上升的。
正如greg所说,如果您需要获得大量数据的准确答案,您应该考虑其他数据类型。考虑到结果应该始终是整数,您可能需要选择
BigInteger
(尽管有所有的除法,结果始终是整数):jucafojl5#
你可以在o(k)中做这样的事情:
编辑if
x
以及y
如果你的答案是大的,那么你的溢出速度会更慢(即,对于较大的x&y值是安全的),如果你在进行以下操作时除以你的答案:2exbekwf6#
我用c#编写了这个代码,但我试图使它尽可能适用于java。
来源于这些资料,再加上我的一些小东西。
http://blog.plover.com/math/choose.html
http://blog.plover.com/math/choose-2.html
代码: