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;
}

posted on 2012-06-29 13:25  carekee  阅读(443)  评论(0编辑  收藏  举报