阶乘是指从1乘到它自己,如5的阶乘是1*2*3*4*5,阶乘也可以用!来表示,即5的阶乘为5!
n!=1*2*...*(n-1)*n。没错阶乘的结果会非常大,所以只能用高精度来做。
话不多说,直接上代码。
#include<bits/stdc++.h>
using namespace std;
int a[400000];//储存数据
int n,x,len=1;//n 阶乘的次数 x 进位 len 长度
int main()
{
cin>>n;
a[1]=1;
for(int i=1;i<=n;i++)//n次循环
{
x=0;//进位清零
for(int j=1;j<=len;j++)
{
a[j]=a[j]*i+x;//每位都乘以i
x=a[j]/10;//计算进位
a[j]%=10;//每位数字都%10
if(x>0&&j>=len)
len++;//改变长度
}
}
for(int i=len;i>=1;i--) //输出结果,倒着输出!!!
cout<<a[i];
return 0;
}
注释也是很多的,也是非常简单的。
当然了,我还写了一个用函数的方法,有点麻烦,那个函数是高精度乘法,因为任意一个n的阶乘就是n-1的阶乘*n,弄清楚这个就好了,有点像递推。
代码:
#include<bits/stdc++.h>
using namespace std;
string s[1000];//n的阶乘
int a[1000];//乘数
int b[1000];//乘数
int c[1000];//结果
string h(string s,string s1){//乘法函数
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int la=s.size();
for(int i=0;i<s.size();i++)
a[i]=s[la-i-1]-'0';
int lb=s1.size();
for(int i=0;i<s1.size();i++)
b[i]=s1[lb-i-1]-'0';
int x=0;
for(int i=0;i<la;i++)
{
x=0;//进位数
for(int j=0;j<lb;j++)
{
c[i+j]=c[i+j]+a[i]*b[j]+x; //计算有多少个计量单位(百 十 千这样的)
x=c[i+j]/10;//计算进位
c[i+j]%=10;// 得到数位上面的数字
}
c[i+lb]=x;//每一次的最高位进位情况一定要保留
}
int lc=la+lb;
while(c[lc]==0&&lc>0) lc--;//去0操作
string s2="";
for(int i=lc;i>=0;i--){
char qq=c[i]+'0';
s2+=qq;
}
return s2;
}
int main()
{
s[0]="0";
s[1]="1";
int n;
cin>>n;
for(int i=2;i<=n;i++){
string jk="",kl="";
int t=i;
while(t>0){
char gh=t%10+48;
jk+=gh;
t/=10;
}
for(int j=jk.size();j>0;j--)
kl+=jk[j-1];
s[i]=h(s[i-1],kl);
}
cout<<s[n];
return 0;
}