壹是考慮到結果數位跨度很大,為提高空間效率用動態數組。二是必須用大數運算處理。三是顯示格式有壹定難度。代碼如下,供參考——
代碼文本:
#include "stdio.h"
#include <stdlib.h>
#include "math.h"
int *FactorialLN(int n,int &ln){
int i,j,*pa;
double dec=0;
for(ln=2;ln<=n;dec+=log10(ln++));
ln=((int)dec+1)/4+1;
if(!(pa=(int *)malloc(sizeof(int)*ln))){
printf("Application memory failure...\n");
return NULL;
}
for(i=0;i<ln;*(pa+i++)=0);
for(ln--,pa[ln]=1,j=2;j<=n;j++){
for(i=ln;i>=0;pa[i--]*=j);
for(i=ln;i>0;i--)
if(pa[i]>9999){
pa[i-1]+=pa[i]/10000;
pa[i]%=10000;
}
}
ln++;
return pa;
}
int main(int argc,char *argv[]){
int m,r,i,j,e,*pm,*pr;
while(1){
printf("Please enter m & r(int 0<=m,n<450)...\n");
if(scanf("%d%d",&m,&r)==2 && m>=0 && m<450 && r>=0 && r<450)
break;
printf("Error, redo: ");
}
printf("%d! - %d! = ",m,r);
if(m<r){
j=m,m=r,r=j;
putchar('-');
}
if((pm=FactorialLN(m,m)) && (pr=FactorialLN(r,r))){
for(i=m-1,j=r-1;j>=0;pm[i--]-=pr[j--]);
free(pr);
for(i=m-1;i>0;i--)
if(pm[i]<0){
pm[i-1]--;
pm[i]+=10000;
}
for(i=0;pm[i]==0;i++);
if(i<m){
if((e=m-i)<<2 > 30){//科學計數格式
for(j=1000;(r=pm[i]/j)==0;j/=10);
printf("%d.",r);
for(j/=10,r=0;j>0;printf("%d",pm[i]/j%10),j/=10,r++);
((e*=4)-=4)+=r;
for(i++,j=1000;r<30;printf("%d",pm[i]/j%10),r++)
if((j/=10)==0)
i++,j=1000;
printf("e%3d",e);
}
else//直接輸出格式
for(printf("%d",pm[i++]);i<m;printf("%4d",pm[i++]));
}
else
printf("0");
printf(".\n");
free(pm);
}
else{
printf("Application memory failure, exit...\n");
if(pm)
free(pm);
if(pr)
free(pr);
}
return 0;?
}