【高精度】1172_求10000以內的階乘
阿新 • • 發佈:2021-01-12
技術標籤:《資訊學奧賽一本通》# 第二部分 基礎演算法# 高精度計算演算法
題目相關
【題目描述】
求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!