读书人

求大神帮小弟我看下这段大数阶乘的代码

发布时间: 2012-04-22 18:34:46 作者: rapoo

求大神帮我看下这段大数阶乘的代码
#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");}这样应该能看懂了吧!用手模拟一下就明白了!! 

读书人网 >C语言

热点推荐