Проблема в вашей функции 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
>
Это кажется дорогостоящим способом вычисления треугольника Паскаля, когда каждая строкаможно извлечь из предыдущего, используя сложение.