求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!源碼