Неправильный вывод языка C ... треугольник Паскаля с использованием 2-мерных массивов - PullRequest
0 голосов
/ 07 ноября 2018

Так что это мой код для печати паскаль треугольника с использованием 2d массивов, но он не дает мне желаемого результата, и я не могу определить, что не так с логикой / кодом.

#include <stdio.h>

int main()
{
    int num, rows, col, k;
    printf("Enter the number of rows of pascal triangle you want:");
    scanf("%d", &num);
    long a[100][100];

    for (rows = 0; rows < num; rows++)
    {
        for (col = 0; col < (num - rows - 1); col++)
            printf(" ");

        for (k = 0; k <= rows; k++)
        {
            if (k == 0 || k == rows)
            {
                a[rows][k] = 1;
                printf("%ld", a[rows][k]);
            }
            else
                a[rows][k] = (a[rows - 1][k - 1]) + (a[rows - 1][k]);
                printf("%ld", a[rows][k]);
        }
        printf("\n");
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете сделать это без использования каких-либо массивов:

#include <stdlib.h>
#include <stdio.h>

int num_digits(int number)
{
    int digits = 0;
    while (number) {
        number /= 10;
        ++digits;
    }
    return digits;
}

unsigned max_pascal_value(int row)
{
    int result = 1;
    for (int num = row, denom = 1; num > denom; --num, ++denom)
        result = (int)(result * (double)num / denom );  
    return result;
}

int main()
{
    printf("Enter the number of rows of pascals triangle you want: ");
    int rows;
    if (scanf("%d", &rows) != 1) {
        fputs("Input error. Expected an integer :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    int max_digits = num_digits(max_pascal_value(rows));
    for (int i = 0; i <= rows; ++i) {
        for (int k = 0; k < (rows - i) * max_digits / 2; ++k)
            putchar(' ');

        int previous = 1;
        printf("%*i ", max_digits, previous);

        for (int num = i, denom = 1; num; --num, ++denom) {
            previous = (int)(previous * (double)num / denom );
            printf("%*i ", max_digits, previous);
        }
        putchar('\n');
    }
}

Выход:

Enter the number of rows of pascals triangle you want: 15
                                  1
                                1    1
                              1    2    1
                            1    3    3    1
                          1    4    6    4    1
                        1    5   10   10    5    1
                      1    6   15   20   15    6    1
                    1    7   21   35   35   21    7    1
                  1    8   28   56   70   56   28    8    1
                1    9   36   84  126  126   84   36    9    1
              1   10   45  120  210  252  210  120   45   10    1
            1   11   55  165  330  462  462  330  165   55   11    1
          1   12   66  220  495  792  924  792  495  220   66   12    1
        1   13   78  286  715 1287 1716 1716 1287  715  286   78   13    1
      1   14   91  364 1001 2002 3003 3432 3003 2002 1001  364   91   14    1
    1   15  105  455 1365 3003 5005 6435 6435 5005 3003 1365  455  105   15    1
0 голосов
/ 07 ноября 2018

У вас нет фигурных скобок вокруг операторов после else, поэтому похоже, что вы удвоите- printf(), когда условие if -элемента истинно.

Я скопировал исходный код на codechef.com/ide и изменил значение io на num, чтобы его просто присвоили 6, что привело к следующему выводу:

Enter the number of rows of pascal triangle you want:     
     11
    1111
   11211
  113311
 1146411
1151010511

Похоже, ты рядом, но ты хочешь 1, 11, 121, 1331 и т. Д., Верно?

Завершение случая else привело к следующему выводу:

 if (k == 0 || k == rows)

   {
        a[rows][k] = 1;
        printf("(%ld)", a[rows][k]);
    }

    else{// START OF BLOCK HERE
        a[rows][k] = (a[rows - 1][k - 1]) + (a[rows - 1][k]);
        printf("(%ld)", a[rows][k]);
    }//END OF BLOCK HERE, NOTE THAT IT INCLUDES THE PRINT IN THE ELSE CASE NOW

OUTPUT:
    Enter the number of rows of pascal triangle you want:
         (1)
        (1)(1)
       (1)(2)(1)
      (1)(3)(3)(1)
     (1)(4)(6)(4)(1)
    (1)(5)(10)(10)(5)(1)

Но я добавил (), чтобы мне было понятнее. Я также добавил «/ n» в конец первого printf, который запрашивает значение num, чтобы первая строка была на новой строке.

printf("Enter the number of rows of pascal triangle you want:\n");
...