Распечатка списка факториалов от (0 до n) в C - PullRequest
0 голосов
/ 25 мая 2018

Так что я только начинаю учиться кодировать, и, возможно, это потому, что я не до конца понимаю природу циклов.

Итак, я хочу получить вывод:

Если введенное значение равно, например, 6, программа должна выдать следующее:

  • 0!= 1
  • 1!= 1
  • 2!= 2
  • 3!= 6
  • 4!= 24
  • 5!= 120
  • 6!= 720

Но вместо этого он печатает это:

  • 0!= 1
  • 6!= 720

Без пулевых точек, очевидно.Очевидно, что второй цикл for не распечатывается должным образом.Я не уверен, почему.Если кто-то может мне помочь, это было бы очень признательно!

РЕДАКТИРОВАТЬ: Я действительно должен был указать, что я ищу.Спасибо за все полезные ответы.Я понимаю, что все ваши решения могут быть действительными, но я ищу решение, которое не включает создание новых процедур и функций. Поскольку мое назначение с использованием дополнительных функций / процедур, отличных от main (), недопустимо. Проблема в моем коде заключается в том, что этот второй цикл for вообще не выполняется, и я понятия не имею, почему.Программа должна принимать входные значения нормально, но я жестко закодировал значения в переменные, думая, что это будет иметь значение, но это не так.Если есть какой-то способ добиться этого, используя циклы if, for или while, это будет для меня оптимальным способом.

#include <stdio.h>

   int main( void )
{
    int number1 = 4;
    int number2;
    int factorial = 1;
    int factorialPrev = 1;

    printf("0! = 1\n");

    for (int i = 0; i < number1; i++)
    {
        factorial = factorial * (number1 - i);
    }

    for (int i = number1 - 1; i <= 0; i--)
    {
        number2 = number1 - i;
        factorialPrev = factorialPrev * number2;
        printf("%d! = %d\n", number2, factorialPrev);
    }

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Это должен быть правильный ответ:

void showfacto(int max) {
if (max< 0) {
    printf("the max cannot be less than 0");
    return;
}   
printf("0! = 1\n");
int x=1;
for (int i= 1; n <= number; n++) {
 {   for(int j=1;j<i)
      x=x*j;
    }
    printf("%d! = %d\n",i, x);
 }  

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

0 голосов
/ 25 мая 2018

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

int fact(int num) {
    if(num > 1) {
        return num * fact(num - 1);
    }
    else {
        return 1;
    }
}

Итак, первоначальный вызов факта (5) прошел бы до факта (1), который возвращает 1. Затем управление возвращается к факту (2), где у вас есть 2 *число, возвращаемое из факта (1), которое равно 1. И так далее до тех пор, пока оно не вернется к начальному вызову факта (5), который должен вернуть конечное значение.

fact(1) = 1
fact(2) = 2 * 1  = 2
fact(3) = 3 * 2  = 6
fact(4) = 4 * 6  = 24
fact(5) = 5 * 24 = 120

Затем в main() у вас был бы цикл, который вызывает рекурсивную функцию от num до 0 с уменьшением.Или, если хотите, можете начинать с 0 и увеличивать до num.

for(x = num; x >= 0; --x) {
    factNum = fact(x);
    printf("%d! = %d\n", x, factNum);
}
0 голосов
/ 25 мая 2018

Ваш код немного ... сбивает с толку, поэтому я просто перепишу его.Вот абсолютный минимум функциональности:

printf("0! = 1\n");

int factorial = 1;
for (int n = 1; n <= number; n++) {
    factorial *= n;
    printf("%d! = %d\n", n, factorial);
}

Давайте обернем это внутри функции:

void printFactorials(int number) {
    printf("0! = 1\n");

    int factorial = 1;
    for (int n = 1; n <= number; n++) {
        factorial *= n;
        printf("%d! = %d\n", n, factorial);
    }
}

А теперь давайте добавим несколько элементов защиты для недопустимых вводов:

void printFactorials(int number) {
    if (number < 0) {
        printf("Input cannot be less than 0");
        return;
    }

    if (number > 9) {
        printf("Input cannot be greater than 9");
        return;
    }

    printf("0! = 1\n");

    int factorial = 1;
    for (int n = 1; n <= number; n++) {
        factorial *= n;
        printf("%d! = %d\n", n, factorial);
    }
}

Наконец, давайте использовать это:

#include <stdio.h>

int main(void) {
    printf("Enter a positive integer between 0 and 9: ");

    int number;
    if (scanf("%d", &number) == 1)
        printFactorials(number);

    return 0;
}
...