Pascal Triangle达到极限

时间:2014-07-11 21:47:16

标签: java algorithm

所以发生的事情是当三角形到达第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; 
} 

 }

2 个答案:

答案 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/