Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帕斯卡';s三角形故障输出_Java_Arrays_Algorithm_Pascals Triangle - Fatal编程技术网

Java 帕斯卡';s三角形故障输出

Java 帕斯卡';s三角形故障输出,java,arrays,algorithm,pascals-triangle,Java,Arrays,Algorithm,Pascals Triangle,嗨,我正在用Java制作一个迭代的Pascal三角形。到目前为止,一切都很正常,直到行数超过13行。输出出现故障。我一定是做错了什么,请帮帮我 迭代帕斯卡: public class IterativePascal extends ErrorPascal implements Pascal { private int n; IterativePascal(int n) throws Exception { super(n); this.n = n;

嗨,我正在用Java制作一个迭代的Pascal三角形。到目前为止,一切都很正常,直到行数超过13行。输出出现故障。我一定是做错了什么,请帮帮我

迭代帕斯卡:

public class IterativePascal extends ErrorPascal implements Pascal {
    private int n;
    IterativePascal(int n) throws Exception {
        super(n);
        this.n = n;
    }
    public void printPascal() {
        printPascal(false);
    }

    public void printPascal(boolean upsideDown) {
        if (n == 0) { return; }
        for (int j = 0; j <= n; j++) {
            for (int i = 0; i < j; i++) {
                System.out.print(binom(j - 1, i) + (j == i + 1 ? "\n" : " "));
            }
        }
    }

    public long binom(int n, int k) {
        return (k == 0 || n == k) ? 1 : faculty(n) / (faculty(k) * faculty(n - k));
    }

    private long faculty(int n) {
        if (n == 0 || n == 1) { return 1; }
        int result = 1;
        for (int i = 2; i <= n; i++) {
            result = result * i;
        }
        return result;
    }
}
public类IterativePascal扩展ErrorPascal实现Pascal{
私人int n;
IterativePascal(int n)引发异常{
超级(n);
这个,n=n;
}
public void printPascal(){
printPascal(假);
}
public void printPascal(布尔值向上向下){
如果(n==0){return;}

对于(int j=0;j您达到了数字溢出。因为
14!
太大,无法填充java
long

解决方案是使用
+
而不是

将三角形保持为二维数组,并对其进行迭代。每个单元格应该是两个“以上”的和

+---+---+---+---+
| 1 |   |   |   |
| 1 | 1 |   |   |
| 1 | 2 | 1 |   |
| 1 | 3 | 3 | 1 |
+---+---+---+---+
代码如下:

public static void triangle(int n) {
    int[][] triangle = new int[n];
    for (int i = 0; i < n; i++) {
        triangle[i] = new int[i+1];
    }
    triangle[0][0] = 1;
    triangle[1][0] = 1;
    triangle[1][1] = 1;
    for (int i = 2; i < n; i++) {
        triangle[i][0] = 1;
        for (int j = 1; j < triangle[i].length - 1; j++) {
            triangle[i][j] = triangle[i-1][j] + triangle[i-1][j+1];
        }
        triangle[i][triangle[i].length-1] = 1;
    }
    printArray(triangle);
}

问题可能出在阶乘的计算中:我假设int类型最多可以容纳32位的数字,但13!大于32位


您可以检查long是否可以存储更大的数字并将结果定义为long。

我有一个递归方法,其中也包含long binom,效果很好。我真的需要坚持使用我的原始代码。感谢您的帮助。如果您想使用binom,只需从long切换到
biginger
s。记住,您可以更精确地计算binom有效。我的意思是,你不应该执行任何除法。与其计算
n!/(k!(n-k)!
calculate
n*(n-1)*……*(k+1)/(n-k)!
。还比你的代码好。我相信真正的爱因斯坦不会称之为“能力”:-)你或你的拼写纠正软件正在寻找的词是“阶乘”。当已存在一个优秀的已接受答案时,请在回答之前尝试确保您有新信息(此答案当前在低质量队列中)也许你在写之前应该真正确定哪个答案是第一个答案。你是对的,对不起,我没有注意到另一个答案也是最近的。新用户回答老问题是很常见的。好吧。不过,你的评论既没有帮助,也不友好,因此毫无用处。
public static void triangle(int n) {
    int[][] triangle = new int[n];
    for (int i = 0; i < n; i++) {
        triangle[i] = new int[i+1];
    }
    triangle[0][0] = 1;
    triangle[1][0] = 1;
    triangle[1][1] = 1;
    for (int i = 2; i < n; i++) {
        triangle[i][0] = 1;
        for (int j = 1; j < triangle[i].length - 1; j++) {
            triangle[i][j] = triangle[i-1][j] + triangle[i-1][j+1];
        }
        triangle[i][triangle[i].length-1] = 1;
    }
    printArray(triangle);
}
public BigInteger binom(int n, int k) {
        return (k == 0 || n == k) ? BigInteger.ONE : faculty(n).divide((faculty(k).multiple(faculty(n - k)));
    }

private BigInteger faculty(int n) {
    BigInteger result = BigInteger.ONE;
    while (!n.equals(BigInteger.ZERO)) {
        result = result.multiply(n);
        n = n.subtract(BigInteger.ONE);
    }
    return result;
}

public void printPascal(boolean upsideDown) {
    if (n == 0) { return; }
    for (int j = 0; j <= n; j++) {
        for (int i = 0; i < j; i++) {
            System.out.print(binom(j - 1, i).toString() + (j == i + 1 ? "\n" : " "));
        }
    }
}