1. 程式人生 > 其它 >PTA 大整數乘法(運算子過載)

PTA 大整數乘法(運算子過載)

輸入樣例:

123456789
987654321
 

輸出樣例:

123456789*987654321=121932631112635269



記錄一下,寫的時候很詭異,在DevC++上跑是正常的,但是提交到pta測試就會報段錯誤。一開始在想是不是陣列開的不夠大,後來一段一段程式碼研究,
最後鎖定發現是因為對*號的過載的返回值是引用型別的,然後返回的那個物件是在函式體裡面定義的,導致出錯了(因為函式內定義的物件在函式結束後消亡了)。
在這之後我用new手動分配記憶體給返回的物件,再返回引用,問題解決!
AC:程式碼

class BigInteger {
    private:
        
int arr[2005]; int size; public: friend istream& operator >>(istream &in,BigInteger &num); friend ostream& operator <<(ostream &out,BigInteger &num); BigInteger() { for(int i=0; i<=2000; i++) arr[i] = 0; size
= 0; } BigInteger& operator *(BigInteger &b) { BigInteger &temp = *(new BigInteger()) ; for(int i=1; i<=this->size; i++) { for(int j=1; j<=b.size; j++) { temp.arr[j+i-1] += this->arr[i]*b.arr[j]; } }
int cur = 2000; for(int i=1; i<2000; i++) { temp.arr[i+1] += temp.arr[i]/10; temp.arr[i] %= 10; } while(cur >= 1 && !temp.arr[cur]) cur--; if(cur == 0) { temp.size = 1; } else temp.size = cur; return temp; } }; istream& operator >>(istream &in,BigInteger &num) { string s; int head = 0; in>>s; while(head < s.size() && s[head] == '0') head++; if(head == s.size()) { num.size = 1; num.arr[1] = 0; } else { num.size = s.size()-head; for(int i=s.size()-1; i>=head; i--) num.arr[s.size()-i] = s[i]-'0'; } return in; } ostream& operator <<(ostream &out,BigInteger &temp) { for(int i=temp.size; i>=1; i--) out<<temp.arr[i]; return out; }