Большая целочисленная задача при работе с факториалами - PullRequest
1 голос
/ 15 апреля 2020

В следующем коде есть проблема, которую я не могу решить:

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

int factorial(long long int x) {
    long long int temp;
    temp = x - 1;

    for (; temp > 0; temp--) {
        x = x * temp;
    }
    return x;
}

int main() {
    long long int x, fact;

    while (1) {
        printf("Please enter the number that you want to learn factoriel...\n(To quit press ctrl+c)\n");
        scanf("%lld", &x);

        if (x == EOF) {
            break;
        }

        if (x >= 0) {
            fact = factorial(x);
            printf("Factorial of %lld is %lld\n", x, fact);
        } else {
            fact = 0;
            printf("Factorial of %lld is %lld\n", x, fact);
        }
    }

    printf("The Program has successfully terminated...\n");
    return 0;
}

Прежде всего, это работает до 17, но в 17 это дает мне отрицательный набор чисел в результате и пару числа позже это дает мне 0 в результате

Как мне это исправить?

1 Ответ

2 голосов
/ 15 апреля 2020

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

uint32_t дает вам диапазон от 0 до 2 ^ 32 = 4 294 967 296, поэтому вы не сможете (должным образом) сохранить число 5000000000, как и для любого другого целочисленного типа.

Есть несколько вариантов:

Цена, которая превосходит первое (и зависит от ситуация, вторая) одна, все варианты увеличены е потребление процессора.

...