正文

阶层和2007-03-02 21:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiaoxiaofeng/23600.html

分享到:

下面是1!+2!+3!+4!+4!+!+6!……+N!的源代码里面有很大数的阶乘的算法主要是按位算,那么大的数,肯定不能几个字节来存放 #include<stdio.h>              /*注释,对算法可能还表达还不是很完全*/#define N 2500                /*为了方便,把两个空间设为一样大,可以调整,以提高速度。不一定*/long int a[N]={0};           /*运算阶乘的空间*/long int b[N]={0};          /*盛放最后的结果*/long int m;                /*特殊算法产生的中间量,表示进位*/long int g=0;             /*输入的数*/main(){  headprint();           /*调用头输出*/  yunsuan();            /*运算*/  print();             /*输出*/} /***********头输出文件,声明作者版权,采集少量数据*******/int headprint()    {     printf("Thanks to use this software!\n");     printf("It can help you to finish the following function:\n");     printf("F(n)=1!+2!+3!+......+(n-1)!+n!\n");                /*以上皆是友情提示*/     printf("Please enter the n:\n");     scanf("%ld",&g);      getchar();                 /*核心*/     printf("running........\nPlease wait!\n");    } /*********计算程序部分************/int yunsuan()    {      int i,j;      for(i=1;i<=g;i++)     /*运 算 主 循 环  */       {    if(i<g)                         /*up*/    printf("run %d\r",i);          /*显示当前运行的数据,主要是有点慢,等得不耐烦,就加了这个显示*/    if(i==g)                      /*up与down之间的这一段,是为了显示,与运算无关*/    printf("Finish %d\n",i);     /*down*/        jiecheng(&i);               /*调用阶乘计算*/        qiuhe();                   /*调用求和运算*/       }     } /*******计算阶乘*******/int jiecheng(int *p)    {    int i,j;     for(i=0;i<N;i++)                /*把运算空间清零,防止造成错误*/     a[i]=0;      a[N-1]=1;                    /* 阶乘空间第一位(在数组中就是最后一位了)初始化为1,,要不然就没办法阶乘了,都是零*/    for(i=1;i<=*p;i++)           /*阶乘主循环*/      {    for(j=N-1;j>=0;j--)   /*每一位都乘阶乘数*/        {          if(a[j]!=0||m!=0||a[j-1]!=0)                {         a[j]=i*a[j]+m;                  /*m:前一组数据传过来的进位*/         m=0;                           /*进位清零,其数据已经加入到数组数据中*/        if(a[j]>9999)                  /*为了防止数据溢出,因为乘法会产生很大数,保守起见设最大数为9999*/          {           m=a[j]/10000;             /*将超过的数据放在m中*/           a[j]=a[j]%10000;         /*取出数据中除去超出范围的数后,剩余的数*/           }       }        }       }      } /*********把结果求和*****/int qiuhe()    {      int i,j;      for(i=N-1;i>=0;i--)              /*求和主循环*/      {       b[i]=b[i]+a[i]+m;               /*过程与阶乘相似,不过这次是加法了*/       m=0;       if(b[i]>9999)                   /*为了保证加法时不会错位,只好把b的最大数也设成9999了*/         {          m=b[i]/10000;          b[i]=b[i]%10000;             /*一样*/         }       }     } /**********输出部分********/int print()    {     int i,j;     FILE *fp;     if((fp=fopen("001","w"))==NULL)                             /*打开文件*/     printf("Can't open this file!\n");     for(i=0;i<N;i++)                                                  if(b[i]) break;     for(;i<N;i++)                                              /*此时就不用再设定i值了*/       {     printf("%ld",b[i]);                                   /*输出到显示器*/     fprintf(fp,"%ld",b[i]);                               /*输出到文件*/       }     fclose(fp);                                               /*关闭文件,经常忘了~嘿嘿~*/     printf("\n\nThe file '001' has been outputted!\n\n");    /*提示*/    getchar();    }

阅读(49) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册