C实现计算任意整数不损失精度的阶乘
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct m_l
{
long data;
struct m_l *next;
}mLong, *pLong;
void tune(pLong long_data);
void multi(pLong long_data, long data);
long display(pLong long_data);
void tune(pLong long_data)
{
pLong pl=long_data, tmp,ptr;
long jw=0;
int new=1;
while (pl!=NULL)
{
pl->data += jw;
jw = (int)(pl->data/10);
pl->data = pl->data%10;
if (pl->next==NULL)
{
if (jw == 0)
{
new =0;
}
else
new=1;
ptr=pl;
}
pl=pl->next;
}
if (new==1)
{
while (jw!=0)
{
tmp=(pLong)malloc(sizeof(mLong));
if(tmp==NULL)
{
printf("malloc error!");
return ;
}
tmp->next=NULL;
ptr->next=tmp;
tmp->data=jw%10;
jw/=10;
ptr=ptr->next;
}
}
}
void multi(pLong long_data, long data)
{
pLong pl=long_data;
while (pl!=NULL)
{
pl->data*=data;
pl=pl->next;
}
tune(long_data);
}
long display(pLong long_data)
{
pLong pl=long_data;
pLong p,q;
long count=0;
printf("Result:");
p=q=pl;
pl=NULL;
while (p->next!=NULL)
{
p=p->next;
q->next=pl;
pl=q;
q=p;
}
q->next=pl;
pl=q;
while (pl!=NULL)
{
count++;
printf("%ld",pl->data);
pl=pl->next;
}
printf("/n");
return count;
}
int main()
{
long s=1,i;
long n;
double start,end1,end2;
pLong pl;
pl=(pLong)malloc(sizeof(mLong));
if (pl==NULL)
{
printf("malloc error/n");
return 0;
}
pl->data=s;
pl->next=NULL;
printf("Please input an integer:");
scanf("%ld",&n);
start=clock();
for (i=s;i<=n;i++)
{
multi(pl,i);
}
end1=clock();
printf("The result contains %ld digits./n",display(pl));
printf("/n");
free(pl);
end2=clock();
printf("Time used for calculate:%lf ms/n",end1-start);
printf("Time used for calculate and print:%lf ms/n",end2-start);
system("PAUSE");
return 0;
}