如何定义函数fact(n) 计算n的阶乘:n!=1*2*……*n,函数返回值类型是double?

 我来答
hwy_2000
2018-02-04 · TA获得超过170个赞
知道小有建树答主
回答量:152
采纳率:100%
帮助的人:87万
展开全部
double?位数太少,来个狠的,要不要!最大可计算(10^9 -1)! 计算10000的阶乘只要0.5秒!(更正一下,计算10000!时,b数据类型可以设置为long,此时运算为0.5秒,设置为long long后耗时增加,也可能CPU速度快不要0.5秒)

//雨中飞燕之作改写
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
long t=2,a,m;
long long b;
main()
{
///////////////////// prepare /////////////////////
int num = 0;
while(1){
printf("Input a natural number that you want to get its factorial.\n");
scanf("%d",&num);
getchar();
if(num <0){
printf("Your Input is illegal!\n");
}
else{
break;
}
}
int digit = 1;
int n = 10;
int i = num;
while(i /= 10){
digit++;
n *= 10;
}//也可以固定n=1000000000(最大),实际测试表明n越大计算速度越快。
char output[8];
sprintf(output,"%%0%dld",digit);
///////////////////// ready ////////////////////////
// 按sizeof(long)==4,sizeof(long long)==8算,
//最大可计算(10^9 -1)! 要求内存够大哦^_^
long *s = (long *) malloc(sizeof(long)*num);
if(NULL == s){
perror("malloc");
return -1;
}
memset(s,0,sizeof(long)*num);
s[0] = 1; //long s[num]={1};
double start,finish;
start = clock();
//原语句简单化
for(t=2;t<=num;t++){
for(a=0;a<=m;a++){
s[a]=(b+=s[a]*t)%n,b/=n;
if( (m==a) && b)m++;
}
}
for(printf("%d!=%ld",num,s[m]);m--;)printf(output,s[m]);//若固定n=1000000000则改为printf("%09ld",s[m]);
printf("\n");

finish = clock();
printf("Spended %f seconds to calculate.\n",(finish-start)/CLOCKS_PER_SEC);
free(s);
#if 0
FILE *fp;//输出到文件,也要求磁盘空间够大^_^
if((fp = fopen("/example/save","w+"))==NULL){
printf("open save file error\n");
}
else{
for(fprintf(fp,"%ld",s[m]);m--;)fprintf(fp,output,s[m]);
}
free(s);
#endif
return 0;
}
/*功能独立出来
long fact(long num,long n,long *s)
{
long t,a;
long m = 0;
long long b = 0;
for(t=2;t<=num;t++){
for(a=0;a<=m;a++){
s[a]=(b+=s[a]*t)%n,b/=n;
if( (m==a) && b)m++;
}
}
return m;
}
*/

/*
#include<stdio.h> //雨中飞燕之作
#define N 1000 //要计算的N
long s[N]={1},n=10000,t=2,a,b,m;main(){
for(;a<=m||++t<=N&&(a=b=0,1);m==a++&&b&&m++)
s[a]=(b+=s[a]*t)%n,b/=n;
for(printf("%d",s[m]);m--;)printf("%04d",s[m]);}
*/
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式