[问题] 大数阶乘运算

楼主: 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