[問題] 大數階乘運算

作者: jellyfishuan (風雪漫天)   2017-04-27 16:52:27
開發平台(Platform): (Ex: Win10, Linux, ...)
win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Visual Studio 2015
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
各位版大好,小弟目前得寫大數計算機,期末實習的project QQ
然後目前卡在階乘的部分惹,網路上搜尋發現大部分資料皆為幾十上百的階乘
例如50!或170!之類的
但我們的大數計算機希望能做到真正的大數那種可能可以處理幾十萬!的
然後現在有個方向是字串讀入輸入的數字
輸入的數字可能過大而int塞不下
然後分解4位並透過stringstream塞入int[8]
int[0]~int[8] 每個陣列裡各有四位數字
舉例來說就是string(123456789012)會變int[0]=1234,int[1]=5678,int[2]=9012這樣
然後再透過int陣列去做階乘
答案的int矩陣假如計算後大於9999,
則int[7]=int[8]/9999,int[8]=int[8]%9999;
But 卡在不知道如何去抓input的長度從而可以塞入陣列裡面
試著編譯過之後 VS的整個專案廢掉說不給用
出現out of range然後說什麼檔案已消失之類的QQ
發問是希望有大大可以指點一下QQ
並順便看一下想的方向正確嗎 因為做到現在有點疑惑,感覺寫到一半覺得方向好像有點
錯Q
作者: Hazukashiine (私は幸せです)   2017-04-27 16:53:00
樓下借我一顆水晶球都天大地大的學校惹 為什麼還不會問問題ㄋ哇靠... 通通不見還真的蠻屌的 屌 爆 了如果很懶的話就用 "GNU MP Bignum Library"至少不用想那些 trivial 的問題 有現成的庫可以用
作者: jerryh001   2017-04-27 17:09:00
string 不是有 length() 可以用?
作者: tuyutd0505 (Huang Jason)   2017-04-27 17:10:00
不限定使用第三方函式庫的話 推薦 GMP library 或 MPIR library(在Win平台我覺得比較好裝) 精度是吃記憶體大小的 記憶體越大可以算得越多
作者: LPH66 (-6.2598534e+18f)   2017-04-27 20:58:00
先給你個心理準備, 幾十萬階乘會有上百萬位數就算四位一組 (順帶一提這裡是 10000 不是 9999)還是會需要那麼大的一個陣列, 寫得出來不一定跑得出來
作者: pttworld (批踢踢世界)   2017-04-27 21:23:00
以int的2147483647來說,二數相乘不能超過,所以取四位數是至多了。取餘是取一萬餘,不是9999。因為是到幾十萬,乘法寫法必須每迴圈乘完做加總後的進位判斷,因為加了幾十萬次有可能溢位,但如果只是幾千,9999的幾千次也放得下,可全部乘完再一次進位處理。如果覺得一般的乘法太慢,可以考慮傅立葉轉換的大數乘法,不過花費記憶體多。
作者: HamalAri (哈馬‧阿里)   2017-04-27 23:25:00
10 萬階乘 43萬位,本人的洨筆電三秒就跑完,gmp很強的洨筆電還只有 2g 呢要相信發展了二十年的東西絕對比自幹的東西好
作者: school4303 (某爬蟲類)   2017-04-28 06:47:00
連.cpp都不見?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-04-28 10:18:00
還 滿 屌 的 屌 爆 了
作者: descent (「雄辯是銀,沉默是金」)   2017-04-28 10:54:00
先把程式碼放在版本控制系統吧
作者: LPH66 (-6.2598534e+18f)   2017-04-28 14:35:00
>HamalAri 他現在就是要想自己寫, 那自己寫就會有這個問題先不說 gmp, 光是大階乘我在幾年前就有看過快速實作那個做法在十幾年前的電腦十萬階乘也能幾秒內跑出來剛剛挖了挖舊檔案翻了出來: http://tinyurl.com/koz86e5不過原 PO 只是要寫個期末 project 而且應該不用玩這麼大而已*所以我只是要提醒原 PO 量力而為, 目標訂太大可能會失望

Links booklink

Contact Us: admin [ a t ] ucptt.com