Какой тип данных или структуру данных выбрать для расчета факториала 100?

Я думал написать программу для оценки факториала данного целого числа.

следуя основам, я написал приведенный ниже код на java:

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

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

мое сомнение было истинным, так как результат, который я получил, был "0"(результат причины может быть вне диапазона long).

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

Я был бы признателен за любое допустимое решение на языке программирования C или Java.

5 ответов


BigInteger - Это ваш класс. Он может хранить целых казалось бы любом размере.

    static BigInteger fact(BigInteger num) {
        if (num.equals(BigInteger.ONE))
            return BigInteger.ONE;
        else
            return num.multiply(fact(num.subtract(BigInteger.ONE)));
    }

Если вы не после наивного подхода факторных вычислений, вы должны сделать некоторые исследования в этой проблеме. Вот хороший обзор некоторых алгоритмов вычисления факториалов: http://www.luschny.de/math/factorial/conclusions.html

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


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

int max = 5000;
void factorial(int arr[], int n){//factorial in array
    if (!n) return;
    int carry = 0;
    int i=max-1;
    for (i=max-1; i>=0; --i){
        arr[i] = (arr[i] * n) + carry;
        carry = arr[i]/10;
        arr[i] %= 10;
    }
    factorial(arr,n-1);
}
void display(int arr[]){// to print array
    int ctr = 0;
    int i=0;
    for (i=0; i<max; i++){
        if (!ctr && arr[i])      
            ctr = 1;
        if(ctr)
            printf("%d", arr[i]);
    }
}
int main(){
    int *arr = calloc(max, sizeof(int));
    arr[max-1] = 1;
    int num = 100;
    printf("factorial of  %d is: ",num);
    factorial(arr,num);
    display(arr);
    free(arr);
    return 0;
}

и работает на все 100! см.: здесь Codepad

Я хотел бы дать вам ссылки на две полезные посты.
1) как обрабатывать произвольно большие целые числа предполагает GPU MP
2) C++ программа для расчета больших факториалов


в java у вас есть BigInteger, который может хранить произвольные большие целые числа. К сожалению, нет equivelent в C. Вы либо должны использовать стороннюю библиотеку, либо реализовать большие целые числа самостоятельно. Типичный подход для этого состоит в том, чтобы иметь динамически выделенный массив, который хранит каждую из цифр данного числа в некоторой числовой системе(обычно база более 10 выбирается так, чтобы уменьшить общее количество цифр, которые вам нужны).


десятичная (Базовая 10) цифра занимает около 3,3 бит(точно: log(10)/log (2)). 100! что-то вроде 158 цифр, поэтому вам потребуется 158 * 3.3 = 520 бит.

конечно, нет встроенного типа В C, который сделает это. Вам нужна какая-то специальная библиотека, Если вы хотите, чтобы каждая цифра в факториальном расчете была "присутствующей".

используя double даст вам приблизительный результат (предполагается, что double - 64-разрядное значение с плавающей запятой IEEE-754 совместимый, или с подобным рядом-IEEE-754 double формат даст около 16 десятичных цифр(52 бита точности, разделенных log(10)/log (2), как указано выше). Я считаю, что в этом значении больше 16 цифр, поэтому вы не получите точное значение, но он вычислит некоторое число, которое находится в пределах 10 или более цифр.