为了账号安全,请及时绑定邮箱和手机立即绑定

计算C中的大数阶乘

计算C中的大数阶乘

慕姐8265434 2019-10-30 13:08:32
在我的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);}
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

100阶乘是巨大的,确切地说是93326215443944944152681699238856266700490715968264381621468592963895217 59999322991560894146397615651828625369792082722375825118521091686400 00000000000000000000。


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


查看完整回答
反对 回复 2019-10-30
?
倚天杖

TA贡献1828条经验 获得超3个赞

如果您不想使用bigint库,则使用stdlib最好的方法是使用long doubleand tgammal()from math.h:


long double fact(unsigned n)

{

    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)

{

    unsigned values[len];

    memset(values, 0, sizeof(unsigned) * len);

    for(size_t i = len; i--; )

    {

        unsigned x = values[i] + (s[i] - '0') * n;

        s[i] = '0' + x % 10;

        if(i) values[i - 1] += x / 10;

    }

}


void factd(char * s, size_t len, unsigned n)

{

    memset(s, '0', len - 1);

    s[len - 1] = '1';

    for(; n > 1; --n) multd(s, len, n);

}


int main(void)

{

    unsigned n = 100;

    size_t len = ceill(log10l(tgammal(n + 1)));

    char dstr[len + 1];

    dstr[len] = 0;

    factd(dstr, len, n);

    puts(dstr);

}


查看完整回答
反对 回复 2019-10-30
  • 3 回答
  • 0 关注
  • 743 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信