首先,題目傳送門是一定要有的
接下來就是題目描述了
用高精度計算出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。輸出格式 乙...