【高精度】求10000以内的阶乘
题目相关
【题目描述】
求10000以内n的阶乘。
【输入】
只有一行输入,整数n(0≤n≤10000)。
【输出】
一行,即n!的值。
【输入样例】
4
【输出样例】
24
分析
首先n的阶乘是从1开始相乘,乘到n为止的总乘积。定义很简单,但是要注意下数据范围,本题的n最大到达了10000。而13的阶乘就已经解决int范围的极限了,更别提10000了。这道题的答案很大,所以要用大数的方式来进行处理。
另外,$n!=(n-1)!\times n $而n的范围又在10000以内,所以可以看作是一个大数乘一个int范围内数字的问题,就不用使用高精乘高精的方法了。
乘法计算时也是类似竖式计算的过程。将小的数字i与大数的每一位相乘,且从低位开始相乘。过程中进行进位操作。
代码实现
#include <iostream>
using namespace std;
int ans[100005]={1,1};//存放阶乘 ans[0]是位数 倒序存放数字
int jw[100005];//进位的值
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//遍历1~n
//求出i的阶乘
// i!= (i-1)! * i
for(int j=1;j<=ans[0];j++){
//ans[0]中存放阶乘的位数
ans[j]=ans[j]*i+jw[j];//将i与每一位进行相乘
jw[j]=0;//重置进位值
if(ans[j]>=10){//超过10要进位
jw[j+1]+=ans[j]/10;//记录进位值
ans[j]%=10;//保留个位
if(j==ans[0]) ans[0]++;//如果到了位数又发生进位,那么位数要发生变化
}
}
}
for(int i=ans[0];i>=1;i--){//从高位开始倒序输出结果
cout<<ans[i];
}
return 0;
}
视频链接
源码
源码上传至Gitee仓库中,欢迎star!
不积硅步,无以至千里。