帕斯卡的三角形二维数组 - 格式化打印输出

问题描述 投票:0回答:5

我有一个小作业,我必须使用二维数组来生成帕斯卡三角形。这是我的代码,它有效。如果我像这样显示三角形,就会有额外的机会:


(来源:daugerresearch.com

但是,我的间距不是这样格式化的。它只是显示所有在左侧排列的数字。它很难描述,但如果你运行它,你就会明白我的意思。

这是我的代码:

public class Pascal {
    public static final int ROW = 16;
    public static void main(String[] args) {
        int[][] pascal = new int[ROW + 1][];
        pascal[1] = new int[1 + 2];
        pascal[1][1] = 1;
        for (int i = 2; i <= ROW; i++) {
            pascal[i] = new int[i + 2];
            for (int j = 1; j < pascal[i].length - 1; j++) {
                pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];
            }
        }
        for (int i = 1; i <= ROW; i++) {
            for (int j = 1; j < pascal[i].length - 1; j++) {
                System.out.print(pascal[i][j] + " ");
            }
            System.out.println();
        }
    }
}

如果有人可以帮助我弄清楚如何向我的程序添加正确的间距以产生图片中所需的输出,那就太好了。我知道我需要在某个地方放一个

System.out.print(" ")
。我只是不知道在哪里。

java arrays multidimensional-array pascals-triangle
5个回答
7
投票

在这里我修改了你的代码,由于我的控制台窗口的限制,它在 ROW 大小到 13 之前打印得非常好:

import java.util.*;

public class Pascal {
    public static final int ROW = 12;
    private static int max = 0;

    public static void main(String[] args) {
        int[][] pascal = new int[ROW + 1][];
        pascal[1] = new int[1 + 2];
        pascal[1][1] = 1;
        for (int i = 2; i <= ROW; i++) {
            pascal[i] = new int[i + 2];
            for (int j = 1; j < pascal[i].length - 1; j++) {
                pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];
                String str = Integer.toString(pascal[i][j]);
                int len = str.length();
                if (len > max)
                    max = len;
            }
        }

        for (int i = 1; i <= ROW; i++) {
            for (int k = ROW; k > i; k--)
                System.out.format("%-" + max + "s", " ");
            for (int j = 1; j < pascal[i].length - 1; j++)
                System.out.format("%-" + (max + max) + "s", pascal[i][j]);
            System.out.println();
        }
    }
}

输出:

                                 1     
                              1     1     
                           1     2     1     
                        1     3     3     1     
                     1     4     6     4     1     
                  1     5     10    10    5     1     
               1     6     15    20    15    6     1     
            1     7     21    35    35    21    7     1     
         1     8     28    56    70    56    28    8     1     
      1     9     36    84    126   126   84    36    9     1     
   1     10    45    120   210   252   210   120   45    10    1     
1     11    55    165   330   462   462   330   165   55    11    1     

5
投票

您遇到间距问题,因为您需要向某些数字添加空格以容纳较大数字占用的空间。首先确定您计划打印的最大数字是多少(以编程方式)。然后确定该数字 log(n) 中的位数。然后,您可以使用此数字来打印位数少于最大数字的数字的空白,以使您的打印看起来更好。


2
投票

您可以在二维数组的左上角构建一个帕斯卡三角形,如下所示:

 1  1  1  1  1  1  1  1  1  1
 1  2  3  4  5  6  7  8  9
 1  3  6 10 15 21 28 36
 1  4 10 20 35 56 84
 1  5 15 35 70 126
 1  6 21 56 126
 1  7 28 84
 1  8 36
 1  9
 1

两个嵌套的streams:先在行上,然后在列上。第一行和第一列的元素都等于 1,所有其他元素都是该行和列中前一个元素的总和。

int n = 10;
// an array of 'n' rows
int[][] arr = new int[n][];
// iterate over the rows of the array
IntStream.range(0, n)
        // a row of 'n-i' elements
        .peek(i -> arr[i] = new int[n - i])
        // iterate over the elements of the row
        .forEach(i -> IntStream.range(0, n - i).forEach(j -> {
            if (i == 0 || j == 0)
                // elements of the first row
                // and column are equal to one
                arr[i][j] = 1;
            else
                // all other elements are the sum of the
                // previous element in the row and column
                arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
        }));
// formatted output
Arrays.stream(arr)
        .map(row -> Arrays.stream(row)
                // format as a two-digit number
                .mapToObj(i -> String.format("%2d", i))
                .collect(Collectors.joining(" ")))
        .forEach(System.out::println);

"%2d"
- 格式为 两位数 数字,当
n=10
,

"%4d"
- 格式为 四位数字,当
n=16
时,依此类推。


0
投票

您也可以参考以下代码

public class Pascal {
    public static final int ROW = 16;

    static long factorial(int ROW) {
        long f;
        for (f = 1; ROW > 1; ROW--) {
            f *= ROW;
        }
        return f;
    }

    static long patt(int ROW, int r) {
        return factorial(ROW) / (factorial(ROW - r) * factorial(r));
    }

    public static void main(String args[]) {
        System.out.println();
        int i, j;
        for (i = 0; i <= ROW; i++) {
            for (j = 0; j <= ROW - i; j++) {
                System.out.print(" ");
            }
            for (j = 0; j <= i; j++) {
                System.out.print(" " + patt(i, j));
            }
            System.out.println();
        }
    }
}

输出:

                  1
                 1 1
                1 2 1
               1 3 3 1
              1 4 6 4 1
             1 5 10 10 5 1
            1 6 15 20 15 6 1
           1 7 21 35 35 21 7 1
          1 8 28 56 70 56 28 8 1
         1 9 36 84 126 126 84 36 9 1
        1 10 45 120 210 252 210 120 45 10 1
       1 11 55 165 330 462 462 330 165 55 11 1
      1 12 66 220 495 792 924 792 495 220 66 12 1
     1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
    1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
   1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
  1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1

0
投票

关于这个之前的答案,您可以使用两个嵌套的增强for循环在左上角输出一个格式化的三角形。

    1    1    1    1    1    1    1    1    1    1    1    1    1    1
    1    2    3    4    5    6    7    8    9   10   11   12   13
    1    3    6   10   15   21   28   36   45   55   66   78
    1    4   10   20   35   56   84  120  165  220  286
    1    5   15   35   70  126  210  330  495  715
    1    6   21   56  126  252  462  792 1287
    1    7   28   84  210  462  924 1716
    1    8   36  120  330  792 1716
    1    9   45  165  495 1287
    1   10   55  220  715
    1   11   66  286
    1   12   78
    1   13
    1

在线尝试!

int n = 14;
// an array of 'n' rows
int[][] arr = new int[n][];
// iterate over the rows of the array
for (int i = 0; i < n; i++) {
    // a row of 'n-i' elements
    arr[i] = new int[n - i];
    // iterate over the elements of the row
    for (int j = 0; j < n - i; j++) {
        if (i == 0 || j == 0) {
            // elements of the first row
            // and column are equal to one
            arr[i][j] = 1;
        } else {
            // all other elements are the sum of the
            // previous element in the row and column
            arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
        }
    }
}
// formatted output
for (int[] row : arr) {
    for (int i : row)
        // format as a four-digit number with one
        // additional whitespace at the beginning
        System.out.printf(" %4d", i);
    System.out.println();
}
© www.soinside.com 2019 - 2024. All rights reserved.