所以发生的事情是当三角形到达第13-14行时数字变得太大或者没有正确计算。无论哪种方式,我已经坚持了一段时间。我认为没有理由在这些更高的数字之前完成计算。可能是值超出了整数的限制或方法中可以包含的值吗? 任何意见或帮助将不胜感激。
public class Pascal {
/**
* @param args
*/
public static void main(String[] args) {
for(int i = 0; i < 10; i++){
for(int j = 0; j <= i; j++){
System.out.print(Pascal.factorial(i) / (Pascal.factorial(j) * Pascal.factorial(i
- j)) + " ");
}
System.out.println();
}
}
public static int factorial(int num){
int num2 = 1;
for(int i = num; i >= 2; i--){
num2 *= i;
}
return num2;
}
}
答案 0 :(得分:1)
是的,12! = 479,001,600适合32位整数但是13! = 6,227,020,800没有。
但是,对于仅涉及加法的二项式系数,存在another formula。如果您使用那个,只要最终结果适合您的类型,您就不必使用更大的类型。
答案 1 :(得分:0)
问题在于评估Pascal三角形的factorial
方法。任何涉及因子的算法最终都会失败,除非你用一些边界限制你的计算(无论你使用什么数据类型,除非它是一些特殊的任意大小的数据类型/结构)
您需要使用更有效的算法来生成二项式系数,这样您就不会突破极限。
以下是伪代码(source)
中的示例算法Function nCk (n, k)
Begin:
if k < 0 Or k > n
return 0
else if k = 0 Or k = n
return 1
k = min(k, n-k) // Fewer interations as nCk = nC(n-k)
Temp = 1
for i = 0 to k - 1
Temp = Temp * (n - 1) / (i + 1)
loop
return Temp
另外,如果你想在没有迭代的情况下非常有效地计算更大的值,你可以使用 Ramanujan的公式来近似阶乘(然后你可以用对数和大数的划分来编写nCr)将成为可管理数字的增加和减少)
以下是了解有关计算因子和相关函数的有效计算的更多信息(http://www.johndcook.com/blog/2012/09/25/ramanujans-factorial-approximation/)