亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算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 關注
  • 788 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號