由于是阶乘数据量比较大,这里用的是字符串存储,按位进行运算,不多说上代码:
#include<bits/stdc++.h>
using namespace std;
#include <stdio.h>
long long f[1005];
int main()
{
int n;
string s[505];
s[1]="1";
cin>>n;
for(int i=2;i<=n;i++)
{
int x=0;
for(int j=0;j<s[i-1].length();j++)
{
int in = (s[i-1][j]-'0')*i;
char ch = (in+x%10)%10+'0';
s[i] += ch;
x=x/10+(in+x%10)/10;
if(j==s[i-1].length()-1 && x>0)
{
while(x)
{
s[i]+=x%10 + '0';
x/=10;
}
}
}
}
for(int i=n-1;i>=1;i--)
{
int x=0;
for(int j=0;j<s[i].length();j++)
{
int in1 = s[n][j] -'0';
int in2 = s[i][j]- '0';
x=in1+in2+x;
s[n][j] = x%10 +'0';
x = x/10;
}
int jj = s[i].length();
while(x)
{
if(jj<s[n].length())
{
int y = (s[n][jj]-'0'+x);
s[n][jj] = y%10 +'0';
x = y/10;
}
else{
while(x)
{
s[n]+= x%10 + '0';
x/=10;
}
}
jj++;
}
}
for(int i=s[n].length()-1;i>=0;i--)
{
cout<<s[n][i];
}
cout<<endl;
return 0;
}
由于用的是s[505]所以最高可以求504的阶乘和,想要更高的话把数组调大点就好了。
|