14:求10000以内n的阶乘
-
总时间限制:
- 5000ms 内存限制:
- 655360kB
-
描述
-
求10000以内n的阶乘。
输入
- 只有一行输入,整数n(0<=n<=10000)。 输出
- 一行,即n!的值。 样例输入
-
100
样例输出
-
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
来源
- JP06
-
-
效率较低,还要优化。//noi_1733 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> using namespace std; int c[100005]={0}; void factoriala(int a[],int b){ for(int i=1;i<=a[0];i++){ a[i]=a[i]*b; } for(int i=1;i<=a[0];i++){ a[i+1]+=a[i]/10; a[i]=a[i]%10; } while(a[a[0]+1]>0){ a[0]++; a[a[0]+1]=a[a[0]]/10; a[a[0]]=a[a[0]]%10; } } void printa(int a[]){ for(int i=1;i<=a[0];i++){ cout<<a[a[0]+1-i]; } } int main(){ int n; c[0]=1; c[1]=1; cin>>n; if(n==0) ; else for(int i=1;i<=n;i++){ factoriala(c,i); } printa(c); return 0; }
-
- 万进制优化
-
//noi_1733_beta1 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> using namespace std; int c[10005]={0}; void factoriala(int a[],int b){ for(int i=1;i<=a[0];i++){ a[i]=a[i]*b; } for(int i=1;i<=a[0];i++){ a[i+1]=a[i+1]+a[i]/10000; a[i]=a[i]%10000; } while(a[a[0]+1]>0){ a[0]++; a[a[0]+1]=a[a[0]]/10000; a[a[0]]=a[a[0]]%10000; } } void printa(int a[]){ for(int i=1;i<=a[0];i++){ if(i==1) cout<<a[a[0]+1-i]; else cout <<setw(4)<<setfill('0')<<a[a[0]+1-i]; } } int main(){ int n; cin>>n; c[0]=1; c[1]=1; if(n==0) ; else for(int i=1;i<=n;i++){ factoriala(c,i); } printa(c); return 0; }