import java.util.Scanner;
public class sdz {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int levels;
levels = sc.nextInt();
for(int i = 0; i <= levels; i++){
for(int j =0; j <= i; j++){
System.out.print(combinatorial(i,j) + " ");
}
System.out.println();
}
}
static int fact(int n ){
if(n > 0)
return n * fact(n-1);
else
return 1;
}
static int combinatorial(int n , int r){
return fact(n)/(fact(r) * fact(n-r));
}
}
当我将等级输入到13时,它失败了,这就是结果 The loop at 13
答案 0 :(得分:2)
这是由integer overflow问题引起的。事实(13)的结果是6227020800,它大于整数。
使用long
(只会延迟问题),BigInteger或定义组合对象。并使用动态编程原则来避免重复计算,如@Kaidul所示
答案 1 :(得分:1)
我不知道它是整数溢出还是其他任何东西。我们能不那么麻烦地编写解决方案?
public static void pascalTriangle(int levels) {
for (int i = 0; i <= levels; i++) {
List<Integer> row = new ArrayList<>();
int s = 1;
for (int j = 0; j <= i; j++) {
row.add(s);
s = s * (i - j) / (j + 1);
}
System.out.println(row);
}
}
我在这里使用了二项式系数公式 nCr+1 = nCr * (n -r) / (r + 1)
。我使用已经计算的结果nCr
来避免重复计算。
在您的版本中,您每次都从头开始计算阶乘。也许使用记忆会很有用。
此外,你实际上并不需要做任何组合的东西来计算帕斯卡三角形。您只需在上一级添加一些内容即可获得当前级别。
public static void pascalTriangle(int levels) {
if (levels == 0) return;
List<Integer> currList = new ArrayList<>();
System.out.println("1");
for (int i = 2; i <= levels; i++) {
List<Integer> prevList = new ArrayList<>(currList);
currList.clear();
currList.add(1);
for (int j = 0, k = 1; k < prevList.size(); j++, k++) {
currList.add(prevList.get(j) + prevList.get(k));
}
currList.add(1);
System.out.println(currList);
}
}