Pascal的三角形图案突然断裂

时间:2019-02-14 12:32:07

标签: java pascals-triangle

以下程序将打印Pascal的三角形。 该程序对于少量输入可以正常工作,但是如果您向构造函数传递的值大于13,则模式会中断。我不明白为什么,需要帮助。还要评论我的编码风格:

/** Following program prints the Pascal triangle 
 * 
 * read from bottom to top to understand the implementation
 */
public class PascalTriangle {

    int noOfRows;

    PascalTriangle(int noOfRows)                    /// user have to provide how many lines of Pascal's triangle he wants to print
    {
        this.noOfRows = noOfRows;
    }
    private int factorial(int n)                    /// this method calculate factorial which we use to calculate the NCR
    {  
        int fact = 1;
        for(int i = 2 ; i <= n ; ++i)
            fact*=i;
        return fact;
    }
    private void printSpaces(int spaceCount)        /// this method prints spaces before the first elements of every line
    {
        for(int i = 1 ; i < spaceCount ; ++i)  
            System.out.print("   ");
    }
    private void printElement(int n , int r)                                /// this method prints an element
    {   
        System.out.printf("%3d",factorial(n)/(factorial(n - r) * factorial(r)));  /// calculate NCR for given no of row and given r
        System.out.print("   ");                                             /// print two spaces after every element
    }
    private void printRow(int rowNumber)           /// this method prints elements of a row
    {  
        int r = 0;                                 /// to calculate NCR r = 0 is always zero for first element of a row
        int noOfElements = rowNumber + 1;          /// Each row contains one element more than which row it is 
        for(int i = 1 ; i <= noOfElements ; ++i)   /// run this loop until you print all elements of that row
        {
        printElement(rowNumber , r);               /// call the printElement method and tell it for which row is it going to print the element and what is r for that element
        ++r;                                       /// increase r for every element;
        }
    }
    public void printPascalTriangle()       /// this function prints the Pascal's Triangle
    {
        int rowNumber = 0;                  /// this variable decides which row of the Pascal's Triangle should print 
        int spaceCount = noOfRows;
        while(rowNumber < noOfRows)         /// print rows of Pascal's  triangle until all rows are printed
        {  
            printSpaces(spaceCount);        /// before printing any row print desired number of spaces 
            printRow(rowNumber);            /// this method prints a row and its argument decides which row to print 
            System.out.println();           /// after printing every row go to next line for next row
            rowNumber++;                    /// increase the row number because next time i want to print next row
            spaceCount--;                   /// decrease space count because next line needs less spaces before first element
        }

    }
    public static void main(String[] args)
    {
        PascalTriangle triangle = new PascalTriangle(20);   /// create an object and provide how many lines you want to print
        triangle.printPascalTriangle();                     /// call the prinitPascalTrianle method to print your Pascal Trianle
    } 

}

1 个答案:

答案 0 :(得分:1)

问题出在您的fact()函数中。让我们将其分离并运行:

public class PascalTriangle {

    private int factorial(int n)
    {
        int fact = 1;

        for (int i = 2; i <= n; i++)
        {
            fact *= i;
        }

        return fact;
    }

    public static void main(String[] args)
    {
        PascalTriangle triangle = new PascalTriangle();

        for (int i = 1; i < 20; i++)
        {
            System.out.printf("%d = %d\n", i, triangle.factorial(i));
        }
    }
}

您会发现,一旦超越fact(12),答案就会错误地显示出来:

> java PascalTriangle
1 = 1
2 = 2
3 = 6
4 = 24
5 = 120
6 = 720
7 = 5040
8 = 40320
9 = 362880
10 = 3628800
11 = 39916800
12 = 479001600
13 = 1932053504
14 = 1278945280
15 = 2004310016
16 = 2004189184
17 = -288522240
18 = -898433024
19 = 109641728
>

由于阶乘增长如此之快,您已经超过了int的容量。如果我们使用相同的代码,并将所有int声明替换为long,则可以看到我们进一步出现了sans错误:

> java PascalTriangle
1 = 1
2 = 2
3 = 6
4 = 24
5 = 120
6 = 720
7 = 5040
8 = 40320
9 = 362880
10 = 3628800
11 = 39916800
12 = 479001600
13 = 6227020800
14 = 87178291200
15 = 1307674368000
16 = 20922789888000
17 = 355687428096000
18 = 6402373705728000
19 = 121645100408832000
> 

当每行都可以使用加法从上一行派生时,这似乎是计算帕斯卡三角形的昂贵方法。