当前位置 博文首页 > 【高精度】求10000以内的阶乘

    【高精度】求10000以内的阶乘

    作者:咸鱼爱学习 时间:2021-01-12 06:01

    题目相关

    【题目描述】

    求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

    下一篇:没有了