【高精度】求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!

Fork Me on Gitee

Fork Me on GitHub

Fork me on Gitee