帕斯卡的三角形图案突然断裂
Pascal's triangle pattern suddenly breaks
以下程序打印帕斯卡三角形。
该程序适用于小输入,但如果您向构造函数传递一个大于 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
}
}
问题出在您的 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
>
当每一行都可以从前一行使用加法导出时,这似乎是一种计算帕斯卡三角形的昂贵方法。
以下程序打印帕斯卡三角形。 该程序适用于小输入,但如果您向构造函数传递一个大于 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
}
}
问题出在您的 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
>
当每一行都可以从前一行使用加法导出时,这似乎是一种计算帕斯卡三角形的昂贵方法。