正文

大数阶乘2008-03-23 13:15:00

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

分享到:


//大数阶乘
// 07.4.27

#include<stdio.h>
#include<time.h>

int main()
{
    double duration;

    int a[100000]={0};
    int N,i,c=1,j;

    a[1]=1;
    clock_t start, finish;

    printf("大数阶乘,请输入一个数\n");
    scanf("%d",&N);
    start = clock();
    for (j=1;j<=N;j++)
    {
        for (i=1;i<=c;i++)
        {
            a[i]=a[i]*j;
        }

        for (i=1;i<=c;i++) 
        {
            /*不能写成(i=c;i>0;i--)因为这样将漏掉低位的进位,
              例如a[3]=7*7,a[2]=3*3,a[1]=2*5,当i减到1时a[1]=10需要向a[2]进一位,而当仅为后
              a[2]=10又该向a[3]进位,但此时循环已是最后一次循环,故不能实现向a[3]进位
              a[4]=4 a[3]=9 a[2]=10 a[1]=0
            */
            if (a[i]>=10)
            { 
                a[i+1]=a[i+1]+a[i]/10;
                a[i]=a[i]%10;
                if(a[c+1]!=0)
                c++;
            }
        }
     //若将if(a[c+1]!=0)语句放于此处(for (i=1;i<=c;i++))之外则造成a[c+1]不是一位数,
     //因为a[c+1]这个元素将不止一位数,当进行例如1000!的计算时
     //会由于a[c+1]数值的溢出而造成计算不准确。
    }
    printf("result:\n");

    for(i=c;i>0;i--)
 {
  printf("%d",a[i]);
    }
    finish = clock();
    printf("\n一共%d位\n",c);
    duration = (double)(finish - start)/CLOCKS_PER_SEC ;
    printf( "%f ms\n", duration );

    getchar();
    getchar();
    return 0;
}

 

阅读(2220) | 评论(0)


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

评论

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