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;
}