高精度 階乘之和(南昌理工學院ACM寒假集訓隊)

2021-10-17 08:15:49 字數 2515 閱讀 9971

身為蒟蒻的我學習了很久,有點小經驗就分享給大家啦!

這道例題呢,來自洛谷p1009 [noip1998 普及組] 階乘之和

大家可以先看看例題哦,對於初學高精度的還是很有幫助的!

我們呢首先來分析一下題目,題目意思呢,超級簡單哦,嘻嘻,給你乙個int型的數n,要求計算n的階乘之和(n<=50)

進入分析之前呢,我想分享一下我第一次的想法:

用乙個for迴圈把每次得到的階乘加起來,然後用乙個遞迴函式把每次的i的階乘給算出來,哈哈哈哈。簡單吧,上**

#include

using

namespace std;

int i,sum=

0,n;

intjie

(int x)

intmain()

嗯不錯,我第一下試了一下1,第二次試了一下3,感覺沒問題了,結果提交了!

可提交上去,我哭了,0分!也就是一次測試都沒有過,我就試了一下大的數,試了30;

結果發現等於乙個負數!

這是為什麼呢?因為30的階乘超過了int型的資料範圍,所以輸出的必然是錯誤的!

題目給的是1~50的範圍,那麼想想最大50的時候,這個資料其實已經超出了long long 的範圍了。。。

什麼是高精度呢?高就是大的意思,精度就是這個資料的範圍,可以超過10的1000000000次方的位數

注意我說的是位數!什麼概念,這個數有100000000000這麼多位!

那麼我們可以用string來儲存,不過在這呢,我推薦大家用vector容器裝這個數,為什麼呢?

因為不管是讀入這個數字無論多大都能用a.push_back(int b)來一直向陣列a的後面加數,還是這個陣列的長度a.size()都很方便!

好,這樣的話,我們就開始今天的題解了!

思路呢,和之前差不多,先定義乙個int n;用來讀入需要計算的階乘之和的數字;

定義vector leijia; vector sum;

第乙個(外迴圈)for就是計算每乙個 i 從1到n的階乘的和;

第二個(內迴圈)for就是計算 i 的階乘;

最後呢,就是輸出這個結果陣列了;

int

main()

leijia =

jia(leijia, sum);}

for(

int i = leijia.

size()

-1; i >=

0; i--

)cout << leijia[i]

;//在這為什麼要逆序輸出呢,原因就是計算的時候低位在陣列最開始的位置!

cout << endl;

return0;

}

先看看mul函式計算階乘,詳細在注釋上面

vector<

int>

mul(vector<

int>

&sum,

int b)

//開頭是返回int型vector陣列,後面呢在sum前面加乙個&,為引用

return jie;

}

再來看看兩位數的相加

vector<

int>

jia(vector<

int>

&a, vector<

int>

&b)if

(t)a.

push_back(1

);//計算到最後還有進製的話,那就進製吧

return jia;

}

完整**

#include

#include

#include

using

namespace std;

int n;

vector<

int>

jia(vector<

int>

&a, vector<

int>

&b)if

(t)a.

push_back(1

);return jia;

}vector<

int>

mul(vector<

int>

& sum,

int b)

return jie;

}int

main()

leijia =

jia(leijia, sum);}

for(

int i = leijia.

size()

-1; i >=

0; i--

)cout << leijia[i]

; cout << endl;

return0;

}

哎,寫完不容易啊,畢竟我是個蒟蒻;

希望對大家有幫助哦!

齊魯理工學院簡介

齊魯理工學院 原曲阜師範大學杏壇學院 是一所經國家教育部批准成立的普通本科高校,學院具有國家統招普通本科 專科等辦學層次。齊魯理工學院設有濟南 曲阜兩個校區。濟南校區位於濟南東部大學城,曲阜校區位於孔子故里曲阜市。校園占地1200餘畝,校舍建築風格獨特,學習環境優雅,具有濃厚的學術和科技文化氛圍。學...

南陽理工學院ACM完全覆蓋

描述 有一天小董子在玩一種遊戲 用2 1或1 2的骨牌把m n的棋盤完全覆蓋。但他感覺遊戲過於簡單,於是就隨機生成了兩個方塊的位置 可能相同 標記一下,標記後的方塊不用覆蓋。還要注意小董子只有在m n的棋盤能被完全覆蓋後才會進行標記。現在他想知道 如果標記前m n的棋盤能被完全覆蓋,標記後的棋盤是否...

棗林村皇家理工學院的總結

好虧啊,再給我十分鐘我就能再拿一道題的分了,但是結果還是沒有拿到,剛開始的時候簡單題a的特別快,我拿到175分時兩邊的那倆人都才看到l2 2題,當時特別爽,天真的以為能上兩百分,先是懟了l3 1結果懟了半天沒有推出來公式,浪費了半個小時,然後懟l3 2,最開始分析思路花了好久,然後好不容易寫了出來,...