【高精度】求10000之內的階乘

題目相關

【題目描述】

求10000之內n的階乘。ios

【輸入】

只有一行輸入,整數n(0≤n≤10000)。git

【輸出】

一行,即n!的值。github

【輸入樣例】

4ide

【輸出樣例】

24spa

分析

首先n的階乘是從1開始相乘,乘到n爲止的總乘積。定義很簡單,可是要注意下數據範圍,本題的n最大到達了10000。而13的階乘就已經解決int範圍的極限了,更別提10000了。這道題的答案很大,因此要用大數的方式來進行處理。code

另外,$n!=(n-1)!\times n $而n的範圍又在10000之內,因此能夠看做是一個大數乘一個int範圍內數字的問題,就不用使用高精乘高精的方法了。視頻

乘法計算時也是相似豎式計算的過程。將小的數字i與大數的每一位相乘,且從低位開始相乘。過程當中進行進位操做。ci

代碼實現

#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;
}

視頻連接

連接get

源碼

源碼上傳至Gitee倉庫中,歡迎star!源碼

Fork Me on Gitee

Fork Me on GitHub

Fork me on Gitee

相關文章
相關標籤/搜索