PTA 大整數乘法(運算子過載)
阿新 • • 發佈:2022-04-10
輸入樣例:
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;
}