1. 程式人生 > 其它 >【高精度】1172_求10000以內的階乘

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