программа для поиска факториала числа с использованием только основной функции - PullRequest
0 голосов
/ 16 октября 2019

Когда я запускаю эту программу, она также даст ответ, но при выборе опции n она снова попросит ввести опции, проверит их и предоставит хорошее решение, как это можно сделать

#include<stdio.h>
int main()
{
    char ch;
    static int count = 0;
    static int num;
    static unsigned long long int res;
    static int temp;

    if (count == 0)
    {
        printf("Enter the value of Number:");
        scanf("%d", &num);
        if (num < 0)
        {
            printf("Invalid input.");
            return 0;
        }
        temp = num;
        res = 1;
        count++;

        do {
            main();
            printf("Factorial of %d is\t:%llu\n", temp, res);
            printf("Do you want to continue y/n :");
            scanf("\n%c", &ch);

        } while (ch == 'y' || ch == 'Y');
    }

    //Logic for recursive factorial function
    if (num > 0)
    {
        res = res * num;
        num = num - 1;
        main();
    }
    else
    {
        count = 0;
    }
    return 1;
}

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Рекурсивный вызов main является абсолютным "не уходи". Никогда не делай этого. Вместо этого просто поместите вычисление факториала сразу после получения ввода.

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

#include<stdio.h>
int main()
{
    char ch;
    int num;
    unsigned long long int res;
    int temp;

    do
    {
        printf("Enter the value of Number:");
        if (scanf("%d", &num) != 1 || (num < 0))
        {
            printf("Invalid input.");
            return 0;
        }

        // Calculate
        temp = num;
        res = 1;
        while (num)
        {
          res = res * num;
          num = num - 1;
        }

        printf("Factorial of %d is\t:%llu\n", temp, res);
        printf("Do you want to continue y/n :");
        scanf("\n%c", &ch);

    } while (ch == 'y' || ch == 'Y');

    return 0;
}
1 голос
/ 16 октября 2019

Рекурсивный вызов "main ()" означает сброс программы? Если да, то почему вы не используете бесконечный цикл для проверки ввода, а затем в теле вы делаете факторные вычисления, выходные данные, такие как распечатки и т. Д., И завершаете программу, когда больше не нужны с определенным вводом. Я считаю, что это должно сработать:

        do {
        printf("Do you want to find a factorial? Y || y to continue");
        scanf("%c", &ch);
        printf("Enter the value of Number:");
        scanf("%d", &num);

//Here you do your factorial number computation and error checks

    } while (ch == 'y' || ch == 'Y');
0 голосов
/ 16 октября 2019

Он снова спрашивает, потому что вы рекурсивно вызываете основную функцию в вашем do, while. Не уверен, что вы хотели сделать с этим рекурсивным вызовом, но уверен, что вы должны удалить эту строку.

=> Remove "main ();"

...