[問題] C++大數乘法的overload

看板C_and_CPP作者 (jimmyoic)時間13年前 (2012/05/20 02:35), 編輯推噓5(5027)
留言32則, 10人參與, 最新討論串1/1
小弟用c++ 想要寫一個class private下變數只有一個 int num[100] 是要用來儲存大數乘法用的值 既然是用class 那就要寫一個operator overloading 給class用 最近剛接觸這個東西還不是很熟 照著一些姑狗的方法試著去做 以下是我的code HugeInt HugeInt::operator*(const HugeInt& number) { int num1=0; HugeInt _number; HugeInt result; for(int i=0 ; i<=99 ; i++) result.num[i] = 0; for(int i=99 ;i>=0; i--){ for(int j=99 ; j>=0 ; j--) result.num[198-i-j] += number.num[i]*_number.num[j]; } for( int i=99 ; i>=0 ; i--){ result.num[i-1] += result.num[i] /10; result.num[i] = result.num[i]%10; } return result; } 我的想法是 把被乘數乘以乘數的每個位數以後 在把每個位數全部加起來總合 ex. 3 5 7 9 * 2 4 6 -------------------------- 18 36 54 14 28 42 10 20 30 6 12 18 -------------------------------- 6 22 52 76 78 54 -> 8 8 0 4 3 4 但實際在C++上跑 都會乘出一大堆數字 (有正有負) @@ 想很久還是不知道問題出在哪@@ 希望有高手能幫解決 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.254.171.40

05/20 02:39, , 1F
相乘和進位都有問題,相乘時你的 rst[..] 會超界,調進位時
05/20 02:39, 1F

05/20 02:40, , 2F
應從低調到高.
05/20 02:40, 2F

05/20 02:41, , 3F
可是我數字最低位是在[99]的位
05/20 02:41, 3F

05/20 02:41, , 4F
只好用這種99-i+99-j巔倒的方式
05/20 02:41, 4F

05/20 02:42, , 5F
oh,這種設計真妙,最低位在99,那試問哪天要擴到200位的話??
05/20 02:42, 5F

05/20 02:43, , 6F
另 , result.num[198-i-j] 想一下 i=j=0 會發生什麼事
05/20 02:43, 6F

05/20 02:44, , 7F
我有想過這種超界的問題 所以最低位要在 0囉?
05/20 02:44, 7F

05/20 02:45, , 8F
一般設計是 num[0] 放低位,硬要放高位我想也可以,只是沒見
05/20 02:45, 8F

05/20 02:46, , 9F
人這麼做,我要說的是,只論低位或高位,都該考慮rst邊界問題
05/20 02:46, 9F

05/20 02:46, , 10F
05/20 02:46, 10F

05/20 02:50, , 11F
確實用現有的函式庫就行了,自己搞,要有效率,正確,不容易
05/20 02:50, 11F

05/20 03:01, , 12F
所以我現在面對的問題就是超界囉?
05/20 03:01, 12F

05/20 03:23, , 13F
但我把迴圈I跟J設只到70還不會超界 也會有一樣的問題@@
05/20 03:23, 13F

05/20 04:01, , 14F
問一個基本的問題,陣列初始值有清0嗎?
05/20 04:01, 14F

05/20 04:02, , 15F
因為result用+=的話,在ctor要把陣列清0
05/20 04:02, 15F

05/20 04:05, , 16F
另外,看不到_number的值是多少。
05/20 04:05, 16F

05/20 10:50, , 17F
通常不用 library 的原因也包含這是作業所以不能用XD
05/20 10:50, 17F

05/20 11:33, , 18F
不能用都是學生想出來的限制吧,不然cout也該自己實作
05/20 11:33, 18F

05/20 14:34, , 19F
只有陣列?那負數怎麼辦?超過100位呢?
05/20 14:34, 19F

05/20 15:51, , 20F
有清0
05/20 15:51, 20F

05/20 16:35, , 21F
但如果作業就是要寫大數運算也不可能讓你直接用
05/20 16:35, 21F

05/20 16:36, , 22F
library 阿XD 而且我還遇過教授真的不給用 library 的
05/20 16:36, 22F

05/20 16:36, , 23F
當時一整個就很不爽..超浪費時間的...
05/20 16:36, 23F

05/20 16:39, , 24F
想必樓上還沒遇過用程式算PI還只限定用定點數運算的
05/20 16:39, 24F

05/20 16:41, , 25F
教授不給用 library..哪天算複eigen-vector的話不就寫死
05/20 16:41, 25F

05/20 16:41, , 26F
連 <complex> 都不能加
05/20 16:41, 26F

05/20 17:32, , 27F
可以的話我不想遇到( ̄ー ̄;)
05/20 17:32, 27F

05/20 18:25, , 28F
硬要老婆把衣服拿到河邊手洗的感覺
05/20 18:25, 28F

05/20 22:46, , 29F
還好啦,又不是大浮點數運算,要高興了~~~
05/20 22:46, 29F

05/20 22:47, , 30F
大數運算真的是月經文,來這邊後常常看到的感覺
05/20 22:47, 30F

05/23 00:00, , 31F
雖然說早就有現成的lib可以用, 但是初學的時候拿來練習
05/23 00:00, 31F

05/23 00:01, , 32F
思考/解決問題,規劃/實作程式,當作練基本功,也不壞吧@@"
05/23 00:01, 32F
文章代碼(AID): #1Fj-WAU7 (C_and_CPP)