Треугольник Паскаля, возвращающий бессмысленные значения - PullRequest
1 голос
/ 30 сентября 2011

Это домашнее задание, которое мне было поручено некоторое время назад ... Я добился успеха в этом самостоятельно, и единственный оставшийся сбой - это (я считаю) проблема с типами данных и переполнением.

Я пытался перейти на unsigned и double, и код соответствует и все еще принимает ввод в терминале, но, кажется, после этого зависает ... ничего не печатается, и похоже, что оно зациклено

Вот код ...

    /* pascaltri.c
     * A program that takes a single integer as input and returns the nth line of
     * Pascal's Triangle. Uses factorial() function to help find items of
     * individual entries on a given row.
     */
    #include <stdio.h>
    #include <stdlib.h>
    long factorial(long i) 
    {
        long fact = 1;

        while(i > 1)
        {
            fact = fact * i;
            i = i - 1;
        }
        return fact;
    }
    main(void)
    {   
        long n;
        long *nPtr;
        nPtr = &n;
        scanf(" %i", nPtr); 
        if (n >= 0)
        {
            long k;
            long *kPtr;
            kPtr = &k;                
            for(k = 0; k <= n; k++)
            {
                long ans;
                long *ansPtr;
                ansPtr = &ans;

                ans = factorial(n) / (factorial(k) * factorial(n - k));
                printf("\n %i", ans);
            }
            return 0;
        }
        return 0;
    }

Он не идеален или хорош, но работает до входа в 13 (то есть в строке 14) треугольника. Кроме того, я начинаю получать бессмысленные и даже отрицательные значения, разбросанные по всем возвращаемым значениям ... гораздо большие значения нарушают код и ничего не возвращают, кроме сообщения об ошибке выхода.

Любые идеи о том, как я могу исправить эту проблему? Я долго смотрел на экран, чтобы действительно что-то увидеть сам. Кроме того, это не существенно, но я хотел бы напечатать мои возвращаемые значения в одной строке, а не разделять их символом новой строки.

1 5 10 10 5 1

Будет ли самый простой способ загрузить значения в массив по мере их вычисления, а затем распечатать массив? Или есть встроенный способ, которым я могу сказать, что оператор печати должен находиться только в одной строке?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Вы страдаете от целочисленного переполнения.Возможно, вам придется найти другой подход к алгоритму, чтобы избежать необходимости вычисления больших чисел.

Отвечая на другой вопрос о новой строке, вы явно печатаете новую строку с \n в своем заявлении на печать.Удалите его, и вы получите ответы, напечатанные в одну строку.Вы, вероятно, захотите включить последний printf("\n"); в конце, чтобы вся строка заканчивалась новой строкой.

Некоторые другие наблюдения:

  • Вам не нужно первое return 0; - элемент управления выпадет из нижней части блока if и перейдет ко второму (должно быть только) return 0; и не вызовет никаких проблем.
  • Вы объявляете kPtr, но не используетеэто где угодно
  • Вам не нужно объявлять отдельную переменную nPtr для передачи scanf;Вы можете передать &n напрямую.
2 голосов
/ 30 сентября 2011

Для мусора вы, скорее всего, столкнетесь с целочисленным переполнением, то есть ваши вычисленные значения станут слишком большими для типа данных long. Вы должны исправить это путем вычисления вашей факториальной функции без явного вычисления n!.

1 голос
/ 30 сентября 2011

Измените scanf(" %i", nPtr); на

scanf(" %ld", nPtr); 

и printf("\n %i", ans); на

printf("\n %ld", ans);

, чтобы получить распечатку в одну строку, используйте:

printf(" %ld", ans);

Есливы используете gcc, включите предупреждения, т.е. используйте -Wall.

...