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

 



 

posted @ 2022-04-10 13:00  m2on  阅读(90)  评论(0编辑  收藏  举报