题目
问题描述
输入一个正整数n,求出1到n的阶乘。n<=30
输入格式
一个整数n
输出格式
一个整数,表示结果
样例输入
9
样例输出
362880
分析
求n的阶乘,从n<=30可以看出结果明显超出longlong的范围,那么就要用到我们的高精度了。高精度的本质是用数组模拟竖式计算,这道题计算里参与的每个数都没有超出int范围,直接读入就行,但结果要用数组记录。
记得第一位初始化为1,下为核心计算部分,可与其他见解搭配食用
for(int i=1;i<=n;i++){//循环n次,每次×i
for(int k=0;k<lena;k++) a[k]*=i;//模拟竖式乘法第一步:将每一位×i
for(int k=0;k<lena;k++){//判断进位
if(a[k]>=10){
a[k+1]+=a[k]/10;//进十位
a[k]=a[k]%10;//保留个位
if(k==lena-1){//若是第一位则将长度更新
lena++;
}
}
}
}
最后输出因为我下标从0开始,所以要<lena,若是从1开始,则要<=lena
for(int i=lena-1;i>=0;i--){
cout<<a[i];
}
本人蒟蒻,写得不好,请见谅