求大神帮我看下这段大数阶乘的代码
#include "stdafx.h"
#define N 1000 //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int _tmain(int argc, _TCHAR* argv[])
{
for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
{
b+=s[a]*t;
s[a]=b%10000;
b/=10000;
}
for(printf("%d",s[*s]);--*s>0;)
printf("%04d",s[*s]);
return 0;
return 0;
}
原来这串代码只有4行,太难看懂,我就把它拆成一句一句的了,但是看着还是毫无头绪,算1000的阶乘几乎就是秒算,还请哪位算法大神指导
[解决办法]
我把秒算10000的阶乘的代码给你 由于结果太大 我已经把它打入文件
输入10000运行之后去工程的当前目录查找res.txt
- C/C++ code
#include<stdio.h>void Fact(int n){ int a[20000] = {1},f,i,j,len = 1; for(i = 2;i<=n;i++) { for(f = 0,j = 0;j<len;j++) { if(!(a[j] || f))continue; a[j] = a[j]*i + f; f = a[j]/100000; a[j] %= 100000; } if(f)a[len++] = f; } FILE *fp = fopen("res.txt","w"); fprintf(fp,"%d",a[--len]); while(len--)fprintf(fp,"%05d",a[len]); fprintf(fp,"\n");}int main(void){ int n; scanf("%d", &n); Fact(n); return 0;}
[解决办法]
又看了一下,发现其实1楼的算法和楼主的是一样的!
下面给出解释:
- C/C++ code
#include <stdio.h>void Factorial(int n);int main(){ int n; while (printf("\nInput a number: "),scanf("%d",&n)!=EOF) { Factorial(n); } return 0;}void Factorial(int n){ int a[100000],tail=0;//tail是最高位的下标 int i,j,iCarry; //iCarry是进位 a[0]=1; for (i=2;i<=n;i++) { iCarry=0; //每次*i前将进位置0 for (j=0;j<=tail;j++) { if (iCarry==0&&a[j]==0) //如果当前位是0并且无进位 { continue; } a[j]=a[j]*i+iCarry; //当前数位*i+进位 iCarry=a[j]/10000; //求新的进位 a[j]%=10000; //更新当前数位 } if (iCarry) //如果超过当前解的长度,将进位添加到解中 { a[++tail]=iCarry; } } for (i=tail;i>=0;i--) //输出 { printf("%d",a[i]); } printf("\n");}这样应该能看懂了吧!用手模拟一下就明白了!!