为什么我的pascal三角形程序没有给出正确的格式?

时间:2015-06-27 17:39:34

标签: java tabs formatting output

我写自己的逻辑来打印pascal三角形。这有以下代码:

import java.util.Scanner;
public class pascal {

    public static void main(String[] arg) {
        Scanner sc = new Scanner(System.in);
        System.out.print("please enter height of pascal triangle :");
        int Heightchk = 0, Height = sc.nextInt();
        if (Height > 0) {
            MYarray PascalArray = new MYarray();
            PascalArray.setLength(Height * 2 - 1);
            PascalArray.IntilizeA(PascalArray.A);
            if (Height == 1) {
                PascalArray.printArray(PascalArray.A);
            } else {
                while (Heightchk < Height) {
                    PascalArray.printArray(PascalArray.A);
                    Heightchk += 1;
                    if (Heightchk < Height) {
                        PascalArray.reSet(PascalArray.B);
                        PascalArray.setElements(PascalArray.A, PascalArray.B);

                        PascalArray.printArray(PascalArray.B);
                        Heightchk += 1;
                        if (Heightchk < Height) {
                            PascalArray.reSet(PascalArray.A);
                            PascalArray.setElements(PascalArray.B, PascalArray.A);
                        }
                    }
                }
            }
        } else {
            System.out.println("Can't Draw pascal Triangle of this Height");
        }
    }
}

class MYarray {
    String[] A, B;
    void IntilizeA(String[] Array) {
        Array[(Array.length - 1) / 2] = "1";
    }
    void setLength(int length) {
        A = new String[length];
        B = new String[length];
        for (int i = 0; i < A.length; i++) {
            A[i] = "\t";
            B[i] = "\t";
        }
    }
    void reSet(String[] Array) {
        for (int i = 0; i < Array.length; i++) {
            Array[i] = "\t";
        }
    }
    void printArray(String[] Array) {
        for (String Element : Array) {
            System.out.print(Element);
        }
        System.out.println();
        System.out.println();
        System.out.println();
    }
    void setElements(String[] from, String[] to) {
        for (int i = 0; i < from.length; i++) {
            if (from[i] != "\t") {
                if (to[i - 1] == "\t") {
                    to[i - 1] = "0";
                }
                if (to[i + 1] == "\t") {
                    to[i + 1] = "0";
                }
                to[i - 1] = String.valueOf(Integer.valueOf(to[i - 1]) + Integer.valueOf(from[i]));
                to[i + 1] = String.valueOf(Integer.valueOf(to[i + 1]) + Integer.valueOf(from[i]));
            }
        }
    }
}

我应用的超级精细的逻辑,但仍然存在元素对齐的问题。 它给出了以下输出:

    please enter height of pascal triangle :5
                1               


            1   1           


        1   2   1       


    1   3   3   1   

虽然它的输出应该是这样的:

    please enter height of pascal triangle :5
                1               


            1       1           


        1       2       1       


    1       3       3       1   


1       4       6       4       1

我的逻辑有什么问题。我怎么能做对的?

2 个答案:

答案 0 :(得分:1)

你的代码绝对没问题。但是当您用任何数字替换选项卡\t时,您最终会删除该数组的那么多缩进。

例如,在您的第一个数组中 1是作为中心元素的第4个元素。这意味着它在Array的中心之前有4个选项卡。

在第二个数组中,在中心索引之前,您已将一个选项卡替换为1,因此第二个数组的缩进最终将数组的中心向左移动,带有1个选项卡。

下一个阵列会继续。所以你的格式错了。要处理此问题,请不要使用数字替换制表符,而是将数字附加到\t。这将确保您的缩进完好无损。

以下是更新的代码。我还更新了您的代码以遵循标准命名约定

import java.util.Scanner;
public class Pascal {

    public static void main(String[] arg) {
        Scanner sc = new Scanner(System.in);
        System.out.print("plese enter height of pascal tringle :");
        int heightchk = 0, height = sc.nextInt();
        if (height > 0) {
            MyArray pascalArray = new MyArray();
            pascalArray.setLength(height * 2 - 1);
            pascalArray.IntilizeA(pascalArray.a);
            if (height == 1) {
                pascalArray.printArray(pascalArray.a);
            } else {
                while (heightchk < height) {
                    pascalArray.printArray(pascalArray.a);
                    heightchk += 1;
                    if (heightchk < height) {
                        pascalArray.reSet(pascalArray.b);
                        pascalArray.setElements(pascalArray.a, pascalArray.b);

                        pascalArray.printArray(pascalArray.b);
                        heightchk += 1;
                        if (heightchk < height) {
                            pascalArray.reSet(pascalArray.a);
                            pascalArray.setElements(pascalArray.b, pascalArray.a);
                        }
                    }
                }
            }
        } else {
            System.out.println("Can't Drow pascal Tringle of this Height");
        }

        sc.close();
    }
}

class MyArray {
    String[] a, b;
    void IntilizeA(String[] array) {
        array[(array.length - 1) / 2] = "\t1";
    }
    void setLength(int length) {
        a = new String[length];
        b = new String[length];
        for (int i = 0; i < a.length; i++) {
            a[i] = "\t";
            b[i] = "\t";
        }
    }
    void reSet(String[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] = "\t";
        }
    }
    void printArray(String[] array) {
        for (String element : array) {
            System.out.print(element);
        }
        System.out.println();

    }
    void setElements(String[] from, String[] to) {
        for (int i = 0; i < from.length; i++) {
            if (from[i] != "\t") {
                if (to[i - 1] == "\t") {
                    to[i - 1] = "0";
                }
                if (to[i + 1] == "\t") {
                    to[i + 1] = "0";
                }
                to[i - 1] = "\t"+String.valueOf(Integer.valueOf(to[i - 1].trim()) + Integer.valueOf(from[i].trim()));
                to[i + 1] = "\t"+String.valueOf(Integer.valueOf(to[i + 1].trim()) + Integer.valueOf(from[i].trim()));
            }
        }
    }
}

输出

                1               
            1       1           
        1       2       1       
    1       3       3       1   
1       4       6       4       1

答案 1 :(得分:0)

由于你知道高度,你可以推断出最后一行的宽度。其中一半是中间,这是第一行应该水平开始的地方。对于每个额外的行,在中间之前再开始几个空格。