階乗 n! の算出


関数名
factorial  階乗n!の値を多桁数で算出する
形式
int factorial(int *data, int n);
引数
data  (出力)n!の値が10進4桁ずつ入った整数の配列
n     (入力) 階乗nの値
関数値
配列dataに計算値の入った要素の数(配列の先頭から)
注意事項

用例(factorial-test.c
int data[1000];
factorial(data, 1000);

1000! の値

プログラム(factorial.c
int factorial(int *data, int n)
{
    int  i, j;
    int  last;
    int  *dap, *dap2;
    int  t;
    long x;
    
    *data = 1;
    last = 0;
    for (i = 1; i <= n; i++) {
        t = 0;
        for (j = 0, dap = data; j <= last; j++) {
            x = *dap;
            x = x * i + t;
            *dap++ = x % 10000;
            t = x / 10000;
        }
        if (t != 0) {
            *dap = t;
            last++;
        }
    }
    
    for (dap = data, dap2 = data + last; dap < dap2; dap++, dap2--) {
        t     = *dap;
        *dap  = *dap2;
        *dap2 = t;
    }
    return last + 1;
}
説明
階乗をまともに 1 x 2 x 3...x n と計算していくと、かなりのコンピュータ でも、すぐにオーバフローしてしまう。

n! の桁数は スターリングの近似式 n! = nne-n (2nπ)1/2より、
   n log10(n/e) + (log10(2nπ)/2+1
で求められる。

関連関数