階乘之和 洛谷 P1009題

2021-10-24 05:57:53 字數 1479 閱讀 3613

首先,題目傳送門是一定要有的

接下來就是題目描述了

用高精度計算出s=1!+2!+3!+…+n! (n≤50) 其中「!」表示階乘,例如:5!=5×4×3×2×1。

乙個正整數n

。乙個正整數s

,表示計算結果。

輸入 #1

3

輸出 #1

9

注:《深入淺出基礎篇》中使用本題作為例題,但是其資料範圍只有 n<=20,使用書中的**無法通過本題。

如果希望通過本題,請繼續學習第八章高精度的知識。

好了,題目看完了,首先肯定要定義變數對吧,因為考慮到1!+2!+3!+…+50!可能會很大,所以定義的變數要盡可能地大,因為題目限制內存在125mb之內,所以int型別的陣列最大的長度為125mb/4b=32768000考慮到後面還會有變數,故把陣列長度設定為3276800接下來就是高精度階乘和高精度加法,如果你學習過高精度,接下來的部分你可以掠過,沒有學習過的可以看一下加粗部分的字

首先是高精度加法,其實就是迴圈把每一位都加起來,比如42954+69837,計算過程如下:

4+7=11,11>=10,所以進製就是1,這一位就變成了1;

3+5+1=9,9<10,所以進製就是0,這一位就還是9;

8+9=17,17>=10,所以進製就是1,這一位就變成了7;

2+9+1=12,12>=10,所以進製就是1,這一位就變成了2;

4+6+1=11,11>=10,所以進製就是1,這一位就變成了1;

所以最後的結果為112791

乘法也一樣,只不過多了些進製而已,知道了這些,就可以做高精度階乘了.

接下來,上**!

#include

#include

#include

#include

using

namespace std;

int fac[

16328

],sum[

16328]=

;//fac代表每次的階乘數,sum代表最後加和

int nmax=int_min;

//隨後輸出數量取fac的最大長度,所以需要nmax

intfactorial

(int n)

mul++

;//每次乘數變大1

while

(carry)

}return len;

//以後要用,需要返回

}int

main()

else tmptmp=0;

//否則進製歸零}}

for(

int i=nmax;i>=

1;i--

) cout<;//反向輸出

return0;

}

洛谷 P1009 階乘之和

題目描述 用高精度計算出s 1 2 3 n n 50 s 1 2 3 n n 50 其中 表示階乘,例如 5 5 times 4 times 3 times 2 times 15 5 4 3 2 1。乙個正整數nn。乙個正整數ss,表示計算結果。輸入 1複製 3輸出 1複製 9分析 本來以為昨晚寫完...

洛谷 P1009 階乘之和

用高精度計算出s 1!2!3!n!n 50 其中 表示階乘,例如 5!5 4 3 2 1。輸入格式 乙個正整數n。輸出格式 乙個正整數s,表示計算結果。輸入樣例 1 複製 3 輸出樣例 1 複製 9 思路 高精度加法 高精度乘法。include include include include usi...

洛谷P1009階乘之和 zhengjun

題目描述 用高精度計算出s 1 2 3 n n 50 s 1 2 3 n n le 50 s 1 2 3 n n 50 其中 表示階乘,例如 5 5 4 3 2 15 5 times 4 times 3 times 2 times 1 5 5 4 3 2 1。輸入格式 乙個正整數nnn。輸出格式 乙...