大数阶乘
2010-03-09 22:56
141 查看
大数阶乘。
阶乘攀升特别快,在C中用int,double等,能计算的范围相当有限;但我们对一个数的表示,按照通常的方法,例如123;如果以10为基,则不同的只是每位所成基数的幂不同。
于是,想到使用一个数组保存数字,而基数可以任意。在计算中,应注意对基数的处理。
在测试中,我计算了10000的阶乘;貌似基数越大,计算的精度越小;但基数如果取小,那么计算的时间会增加。
在网上看到可以通过在C中嵌入汇编来提高速度,没试过。
阶乘攀升特别快,在C中用int,double等,能计算的范围相当有限;但我们对一个数的表示,按照通常的方法,例如123;如果以10为基,则不同的只是每位所成基数的幂不同。
于是,想到使用一个数组保存数字,而基数可以任意。在计算中,应注意对基数的处理。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define BUFFSIZE 50000 #define BASE 10000 int main(void) { int buff[BUFFSIZE]={0}; int N,i,k,j=0; int len=1; int add=0; FILE *fr,*fw; clock_t start,end; start=clock(); if((fr=fopen("input.txt","r"))==NULL) { perror("input.txt"); exit(EXIT_FAILURE); }//if if((fw=fopen("output.txt","w"))==NULL) { perror("input.txt"); exit(EXIT_FAILURE); }//if fscanf(fr,"%d",&N); N++; buff[0]=0; buff[1]=1; while(N-->1) { for(i=1;i<=len;i++) { k=buff[i]*N+add; add=k/BASE; buff[i]=k%BASE; } while(add>0){ buff[++len]=add%BASE; add/=BASE; } }//while len++; while(--len>0) fprintf(fw,"%d",buff[len]); fclose(fr); fclose(fw); end=clock(); printf("%lf",(((double)(end-start)/CLOCKS_PER_SEC)*1000.00)); return EXIT_SUCCESS; }
在测试中,我计算了10000的阶乘;貌似基数越大,计算的精度越小;但基数如果取小,那么计算的时间会增加。
在网上看到可以通过在C中嵌入汇编来提高速度,没试过。
相关文章推荐
- 求大数阶乘(存储在数组中)
- 大数阶乘
- hdu 1042 阶乘--大数乘法
- 斯特林(Stirling)公式 求大数阶乘的位数
- 2018年全国多校算法寒假训练营练习比赛(第三场)---E---题(大数阶乘(模板题)c++/java/py)
- 大数运算(6)——大数阶乘(求位数)
- 大数相乘的问题——大数阶乘(整数)
- 2018年全国多校算法寒假训练营练习比赛(第三场)E-进击吧!阶乘(大数问题)
- java中超出long范围的数的大数阶乘解法并求尾零,运用BigDecimal类
- NYOJ 28-大数阶乘
- 大数阶乘,用数组存放阶乘结果
- 大数,高精度计算---大数阶乘
- 求大数阶乘
- nyoj 28 大数阶乘
- 大数阶乘
- java大数进制转换-N的阶乘
- ObjC 实现的大数相加,大数相乘和n的阶乘
- 大数阶乘
- 大数n的阶乘
- 另一种求大数阶乘的算法