帮我优化一下超精度阶乘的代码.
帮我优化一下超精度阶乘的代码.我写的很不好,特别是要申请的内存单元太大了.
如果代码太垃圾,可以全部推翻重写的,IDE是DEV C++
============================================
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int num=40000;
/*
将整数转换成数组
*/
int* inttoarray(int x)
{
int *a,i=0;
a=(int *)calloc(5,sizeof(int));
do
{
*(a+i)=x%10;
x/=10;
i++;
}
while(x>0);
return a;
}
/*
模拟乘法
*/
int* factorial(int *a,int *b)
{
int *c,i,j;
c=(int *)calloc(num,sizeof(int));
if(c==NULL)
{
printf("Error");
return NULL;
}
for(i=0;i<num;i++)
{
if(*(a+i)==0)continue;
for(j=0;j<5;j++)
{
if(*(b+j)==0)continue;
*(c+i+j)+=(*(a+i))*(*(b+j));
if(*(c+i+j)>9)
{
*(c+i+j+1)+=*(c+i+j)/10;
*(c+i+j)%=10;
}
}
}
free(a);
free(b);
return c;
}
/*
倒序输出
*/
void outputarray(int *a)
{
int i;
for(i=num-1;i>=0;i--)
{
if(*(a+i)!=0)break;
}
printf("阶乘结果为:");
for(;i>=0;i--)
{
printf("%d",*(a+i));
}
printf("\n");
}
int main(int argc, char *argv[])
{
int n,i,*a;
a=(int*)calloc(num,sizeof(int));
*a=1;
printf("你想求什么数的阶乘?请输入该数:");
scanf("%d",&n);
printf("开始...\n");
for(i=1;i<=n;i++)
{
a=factorial(a,inttoarray(i));
if((i%(n/80))==0)printf(">");
}
printf("完成\n");
outputarray(a);
system("PAUSE");
return 0;
}