大数的阶乘

To calculate factorial in linux c & bash shell & bc.

linux c version:

#include <stdio.h>
int big[10001][800],len[10001],BASE=10000;
int i,j,tmp,up,n;
void print(int n){
    printf("%d",big[n][len[n]-1]);
    for(i=len[n]-2; i >= 0; i--)printf("%04d",big[n][i]);
    printf("\n");
}
int main(){
    big[0][0] = big[1][0] = len[0] = len[1] = 1; //0和1的阶乘都是1
    for(i=2; i<=10000; i++){ //计算10000以内的所有数的阶乘
        up = 0;
        for(j=0; j<len[i-1]; j++){
            tmp = up + i * big[i-1][j];
            up = tmp / BASE;
            tmp = tmp % BASE;
            big[i][j] = tmp;
        }
        if(up > 0){ big[i][j] = up;len[i] = j+1; }
        else len[i] = j;
    }
    while(~scanf("%d",&n))print(n);
    return 0;
}

bash shell version:

#!/bin/bash  
nn=$1  
rad=10000  
len=1  
buffs[1]=1  
for (( i=1; i <= nn; i++ )); do  
    let cc=0  
    for ((j=1; j<=len; j++)) ; do  
        let tt=buffs[j]*i+cc  
        let buffs[j]=tt%rad  
        let cc=tt/rad  
    done         
         
    if  [ $cc -gt 0 ] ; then  
        let len=len+1  
        let buffs[len]=cc  
    fi  
done  
  
echo -n ${nn}!=${buffs[$len]}  
for ((i=len-1; i>=1; i--)) ; do  
    echo -n `printf "%04d" ${buffs[$i]}`  
done  
echo

bc file version:

define f(x) {
    if (x <= 1) return (1);
    return (x*f(x-1));
}

and you can type: echo f(100) | bc f.bc to calculate 100’s factorial.

(For more about bc, you can go to http://www.linuxjournal.com/article/2544)

comments powered by Disqus