计算C中的大数阶乘

在我的C代码中,我想为1到100范围内的数字计算阶乘。对于较小的数字,该函数有效,但对于较大的数字,例如100!它返回错误的结果。在C中处理大数阶乘的任何方法。我使用的编译器是gcc v4.3.3。我的代码如下:


#include <stdio.h>

#include <math.h>


double print_solution(int);


int main(void)

{

        int no_of_inputs,n ;


        int ctr = 1;


        scanf("%d",&no_of_inputs); //Read no of inputs


        do

        {

                scanf("%d",&n); //Read the input


                printf("%.0f\n",print_solution(n));


                ctr++;  


        }while(ctr <= no_of_inputs);



        return 0;       

}


double print_solution(int n)

{

        if(n == 0 || n == 1)

                return 1;

        else

                return n*print_solution(n-1);



}


慕姐8265434
浏览 759回答 3
3回答

人到中年有点甜

100阶乘是巨大的,确切地说是93326215443944944152681699238856266700490715968264381621468592963895217 59999322991560894146397615651828625369792082722375825118521091686400 00000000000000000000。也许您应该使用像GMP这样的bignum库。它具有出色的文档,相当一致的界面,速度,如果您使用的是Linux,则发行版中可能会有一个软件包(我认为我默认安装了该软件包)

倚天杖

如果您不想使用bigint库,则使用stdlib最好的方法是使用long doubleand tgammal()from math.h:long double fact(unsigned n){&nbsp; &nbsp; return tgammal(n + 1);}100!在x86上(即80 bit long double),这将为您提供18位小数的精度。确切的实现也不是那么复杂:#include <math.h>#include <stdio.h>#include <string.h>void multd(char * s, size_t len, unsigned n){&nbsp; &nbsp; unsigned values[len];&nbsp; &nbsp; memset(values, 0, sizeof(unsigned) * len);&nbsp; &nbsp; for(size_t i = len; i--; )&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; unsigned x = values[i] + (s[i] - '0') * n;&nbsp; &nbsp; &nbsp; &nbsp; s[i] = '0' + x % 10;&nbsp; &nbsp; &nbsp; &nbsp; if(i) values[i - 1] += x / 10;&nbsp; &nbsp; }}void factd(char * s, size_t len, unsigned n){&nbsp; &nbsp; memset(s, '0', len - 1);&nbsp; &nbsp; s[len - 1] = '1';&nbsp; &nbsp; for(; n > 1; --n) multd(s, len, n);}int main(void){&nbsp; &nbsp; unsigned n = 100;&nbsp; &nbsp; size_t len = ceill(log10l(tgammal(n + 1)));&nbsp; &nbsp; char dstr[len + 1];&nbsp; &nbsp; dstr[len] = 0;&nbsp; &nbsp; factd(dstr, len, n);&nbsp; &nbsp; puts(dstr);}
打开App,查看更多内容
随时随地看视频慕课网APP