大数阶乘-ny-28

大数阶乘

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述

我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?

输入

输入一个整数m(0<m<=5000)

输出

输出m的阶乘,并在输出结束之后输入一个换行符

样例输入

50

样例输出

30414093201713378043612608166064768844377641568960512000000000000

来源

经典题目

解题思路:

1、每次乘完就立即保存在数组中,对10取余后保存,对10取整向前进位。

#include<stdio.h>

#include<string.h>

#define N 100000

int main()

{

    int a[N],n,m,i,j,k,t,r;

    while(scanf("%d",&n)!=EOF)

    {

      memset(a,0,sizeof(a));                

      a[0]=1;   

       r=1;                   //  保存的数组长度初始值为 1;

      for(j=2;j<=n;j++)

      {

       k=0;

       for(i=0;i<=r;i++)       // 每一位分别乘以需要乘的数

        {

          t=a[i]*j+k;         // a[i],可能为0.所以结果不会多乘的。

          a[i]=t%10;

          k=t/10;

          if(i==r&&k!=0)//判断是否溢出 ,溢出则把长度加一。以便下次循环相乘

          r++;

        }

      }

      for(i=r;j>=0;i--)          //判断结果的最高位是否为0 。为零则删除。

        if(a[i])

        break; 

     for(j=i;j>=0;j--)             // 输出结果,注意 是 j=i;i是判断后的结果;

    printf("%d",a[j]);

    printf(" ");

   }

   return 0;

}

原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3224410.html