大数的阶乘
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)