NYOJ 28 大数阶乘

大数阶乘

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
 
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000

模拟题:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 1000010
 4 int a[N];
 5 int imitation(int n)
 6 {
 7     int i;
 8     for(i=0;a[i]>=0;i++)
 9     {
10         a[i]*=n;
11     }
12     for(i=0;a[i]>=0;i++)
13     {
14         if(a[i]>=10)
15         {
16             if(a[i+1]<0)
17                 a[i+1]=0;
18             a[i+1]+=a[i]/10;
19             a[i]%=10;
20         }
21 
22     }
23     return i+1;
24 
25 }
26 int main()
27 {
28     int i,m,flag;
29     memset(a,-1,N*sizeof(int));
30     scanf("%d",&m);
31     a[0]=1;
32     for(i=2;i<=m;i++)
33     {
34         flag=imitation(i);
35     }
36     for(i=flag;i>=0;i--)
37     {
38         if(a[i]>=0)
39             printf("%d",a[i]);
40     }
41     printf("\n");
42     return 0;
43 }

 

 1  
 2 #include<iostream>
 3 #include<iomanip>
 4 using namespace std;
 5 //存储20000以内的阶乘
 6 int a[15470];
 7 int main()
 8 {
 9     //freopen("1.txt","r",stdin);
10     //freopen("2.txt","w",stdout);
11     int n;
12     cin>>n;
13     a[1]=1;
14     a[0]=1;
15     int up;
16     for(int i=2;i<=n;++i)
17     {
18         up=0;
19         for(int j=1;j<=a[0];++j)   //各个位相乘
20         {
21             a[j] *=i;
22             a[j] +=up;
23             up=a[j]/100000;
24             a[j] %=100000;
25         }
26         if(up!=0)
27         {
28             a[0]++;
29             a[a[0]]=up;
30         }
31     }
32     if(a[0]==1) cout<<a[1];
33         else
34         {
35             cout<<a[a[0]];
36             for (int i=a[0]-1;i>0;i--)
37             {
38                 cout<<setfill('0')<<setw(5)<<a[i];
39             }
40         }
41 }        

 

posted @ 2015-02-27 13:10  Tiey  阅读(207)  评论(0编辑  收藏  举报