Код треугольника Паскаля не работает после определенной строки

import java.util.*;
public class PascalFinal
{
public static void main() 
{
    Scanner f = new Scanner(System.in);
    System.out.print("How many rows of Pascal's triangle do you want to print: ");
    int row = f.nextInt();
    Pascal(row);

    showPascal(Pascal(row));
}

public static void showPascal(int[][] Pascal)
{
    for(int a = 0; a < Pascal.length; a++)
    {
        for(int b = 0; b < Pascal[a].length; b++)
        {
            System.out.print(Pascal[a][b] + " ");
        }
        System.out.println();
    }
}

public static int[][] Pascal(int x)
{
    int[][] Pascal = new int[x][];
    int rowLength = 1;
    for(int a = 0; a < x; a++)
    {
        Pascal[a] = new int[rowLength];
        rowLength++;
    }



    for(int a = 0; a < Pascal.length; a++)
    {
        for(int b = 0; b < Pascal[a].length; b++)
        {
            int Piscal = a-b;

            Pascal[a][b] = Factorial(a)/Factorial(b)/Factorial(Piscal);
        }
    }

    return Pascal;
}

public static int Factorial(int n)
{

    if (n < 0) 
    {
        int x = -1;
        return x;
    }

    if (n == 0) 
    {
        int x = 1;
        return x;
    }
    else 
    {
        return (n * Factorial(n - 1));
    } 
}

Когда я запускаю этот код, он отлично работает для первых 13 строк, но затем начинает вводить странные значения для остальных строк. Сначала я подумал, что это может быть связано с тем, что значения из-за метода факториала становятся слишком большими, а тип данных int не может его содержать, но я не уверен. Понятия не имею, почему это запутано. Пожалуйста помоги.

Изменить: я попытался использовать тип данных long вместо int, но та же проблема возникает, когда я прошёл 20 строк.

1 ответ

Решение

Если треугольник Паскаля, который вы должны нарисовать, - это тот, который разработан здесь, вам не нужно оценивать факториал.

Каждая строка может быть оценена с использованием предыдущей строки с простыми суммами...

Вы можете сделать это с помощью массива. Как предложение, начните с arrary: [0, 1, 0] и помните, что следующий ряд может быть оценен, делая сумму соседних чисел предыдущего ряда.

Вам нужно перебрать [0, 1, 0] и создать [0,1,1,0], а затем [0,1,2,1,0]

Как видите, первое - 0 и всегда остается 0, следующее - сумма первых двух и т. Д.

Другие вопросы по тегам