C/找到190!c编程中的(阶乘)

C/找到190!c编程中的(阶乘),c,fact,C,Fact,我试着找到190在C中 我将变量定义为long double,但我发现它(正确地)只计算到172!: 在那之后,我得到了#INF00000…` 有办法吗?一种方法是使用任意精度的算法。您可以自己实现,也可以使用其中之一 请注意,即使值为172!您得到的结果很可能只是大致正确。190的阶乘是: 9680322267525524915612346514615331205418161260462873360750859944104623425228207640470674933540169424682

我试着找到
190
C

我将变量定义为long double,但我发现它(正确地)只计算到172!:

在那之后,我得到了
#INF00000
…`


有办法吗?

一种方法是使用任意精度的算法。您可以自己实现,也可以使用其中之一

请注意,即使值为172!您得到的结果很可能只是大致正确。

190的阶乘是:

96803222675255249156123465146153312054181612604628733607508599441046234252282076404706749335401694246823605259919829615696983449594045555370452536602287443198327465657055663387300134094795955322962027305744027298317935914105128942634895876382260841068184328004851745648000000000000000000000000000000000000000000000

或者,1170位。所以这不适合任何内置类型。您确实需要一个bigint库来表示这么大的内容。

此示例(Win32/Visual Studio Express)程序显示错误会变成一个错误!23具有无符号64位:

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


unsigned __int64 fact( unsigned __int64 in) {
    if( in == 1 ) {
        return 1;
    }
    unsigned __int64 f = fact(in-1);
    printf( "!%3I64u = %20I64u = 0x%016I64X\n", in-1, f, f );
    return in*f;
}

int main( int argc, char * argv[] ) {
    unsigned __int64 in = atoi(argv[1]);
    unsigned __int64 f  = fact(in);
    printf( "!%3I64u = %20I64u = 0x%016I64X\n", in, f, f );
    return 0;
}

!!21和之后的函数都是错误的。

实际上只需要几行代码就可以实现足够多的bigint实现来计算阶乘。下面是打印前200个阶乘的代码

#include <stdio.h>

int mult(int n, size_t size, unsigned char *data) {
    int carry = 0;
    for (int i = 0; i < size; i++) {
        int result = data[i] * n + carry;
        data[i] = result % 100;
        carry = (result - data[i]) / 100;
    }
    return carry != 0;
}

void print(size_t size, unsigned char *data) {
    int first = 1;
    for (int i = 0; i < size; i++) {
        int d = data[size - i - 1];
        if (first && d == 0) continue;
        printf("%0*d", first && d < 10 ? 1 : 2, d);
        first = 0;
    }
}

int main(int argc, char*argv[]) {
    for (int fact = 1; fact <= 200; fact++) {
        unsigned char data[1000] = {1};
        for (int i = 1; i <= fact; i++) {
            if (mult(i, sizeof(data), data)) {
                return 1;
            }
        }
        printf("%d! = ", fact);
        print(sizeof(data), data);
        printf("\n");
    }
    return 0;
}
#包括
int mult(int n,size\u t size,无符号字符*数据){
整数进位=0;
对于(int i=0;i对于(int fact=1;事实上您需要使用一个bigint库。请尝试以下操作:的可能重复项
#include <stdio.h>

int mult(int n, size_t size, unsigned char *data) {
    int carry = 0;
    for (int i = 0; i < size; i++) {
        int result = data[i] * n + carry;
        data[i] = result % 100;
        carry = (result - data[i]) / 100;
    }
    return carry != 0;
}

void print(size_t size, unsigned char *data) {
    int first = 1;
    for (int i = 0; i < size; i++) {
        int d = data[size - i - 1];
        if (first && d == 0) continue;
        printf("%0*d", first && d < 10 ? 1 : 2, d);
        first = 0;
    }
}

int main(int argc, char*argv[]) {
    for (int fact = 1; fact <= 200; fact++) {
        unsigned char data[1000] = {1};
        for (int i = 1; i <= fact; i++) {
            if (mult(i, sizeof(data), data)) {
                return 1;
            }
        }
        printf("%d! = ", fact);
        print(sizeof(data), data);
        printf("\n");
    }
    return 0;
}