C++更大的整数类的构建

注意:

```只需要考虑非负情况!在测试时也将保证不会出现负数。在减法中结果也不会为负数。

目前已有的整数类仍有一些缺陷,例如int的存储范围为 [-2^31, 2^31 - 1]。因此mfc希望实现MyInteger类,并可以高效地实现部分操作。你需要实现的操作有:
构造函数:
MyInteger() //默认构造很熟构造函数, 默认值为0
MyInteger(string& num) // 构造函数,从字符符串构造为大整数。
MyInteger(int num) // 构造函数,从整型构造为大整数。

~MyInteger() // 析构函数

成员函数:
string getnum() // 返回表示大整数的字符字符串,注意去除前导零。
例:
MyInteger bint(123);
cout << bint.getnum() << endl;
// will output "123"

MyInteger bint("01895");
cout << bint.getnum() << endl;
// will output "1895"


```c++
MyInteger operator+(const MyInteger& bint2) //大整数加法
MyInteger operator-(const MyInteger& bint2) //大整数减法
MyInteger operator-(const MyInteger& bint2) //大整数乘法

按照顺序测试以下函数:

getnum 函数 (20pts)
加法重载 (30pts)
减法重载 (30pts)
乘法重载 (20pts)
下面是写好的私有成员变量

class MyInteger{
private:
string num;
public:
//balabala
};

就是用数字字符进行运算。
运行结果:

img

代码:

#include <iostream>
#include <string>
using namespace std;

#define MAXNUM (int)300

class MyInteger{
private:
    string num;
public:
    MyInteger(){num="0";}
    MyInteger(string s){num = s;}
    ~MyInteger(){}
    string getnum(){return num;}
    void setnum(string s){num =s;}

    MyInteger operator+(const MyInteger& bint2) //大整数加法
    {
        char* a = new char[MAXNUM];
        char* b = new char[MAXNUM];
        char* c = new char[MAXNUM];
        strcpy(a,num.c_str());
        strcpy(b,bint2.num.c_str());
        bigAdd(a,b,c);
        MyInteger res(c);
        free(a);a=0;
        free(b);b=0;
        free(c);c=0;
        return res;
    }
    MyInteger operator-(const MyInteger& bint2) //大整数减法
    {
        char* a = new char[MAXNUM];
        char* b = new char[MAXNUM];
        char* c = new char[MAXNUM];
        string flag ="";
        strcpy(a,num.c_str());
        strcpy(b,bint2.num.c_str());
        if(num.length() > bint2.num.length())
            bigSub(a,b,c);
        else if(num.length() < bint2.num.length())
        {
            flag ="-";
            bigSub(b,a,c);
        }else
        {
            if(strcmp(num.c_str(),bint2.num.c_str())> 0)
                bigSub(a,b,c);
            else if(strcmp(num.c_str(),bint2.num.c_str())<0)
            {
                flag ="-";
                bigSub(b,a,c);
            }else
            {
                free(a);a=0;
                free(b);b=0;
                free(c);c=0;
                return MyInteger("0");
            }
        }
        string str = c;
        MyInteger res(flag + str);
        free(a);a=0;
        free(b);b=0;
        free(c);c=0;
        return res;
    }
    MyInteger operator*(const MyInteger& bint2) //大整数乘法
    {
        char* a = new char[MAXNUM];
        char* b = new char[MAXNUM];
        char* c = new char[MAXNUM];
        strcpy(a,num.c_str());
        strcpy(b,bint2.num.c_str());
        bigMul(a,b,c);
        MyInteger res(c);
        free(a);a=0;
        free(b);b=0;
        free(c);c=0;
        return res;
    }

private:
    //去除前面的0
    void movePreZero(char c[])
    {
        int i;
        while (c[0] == '0')
        {
            for (i = 0; i < strlen(c) - 1; i++)
                c[i] = c[i + 1];
            c[strlen(c) - 1] = 0;
        }
    }

    //大数相加
    void bigAdd(char a[], char b[], char c[])
    {
        int i = 0;
        int shift = 0, val;
        int l1 = strlen(a);
        int l2 = strlen(b);

        int len = l1 > l2 ? l1 : l2;
        len += 1; //多留一个进位

        c[len] = 0; //后一个位置为0
        //从后往前迭代
        l1--;
        l2--;
        len--;
        while (l1 >= 0 && l2 >= 0)
        {
            int t = (a[l1] - '0') + (b[l2] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l1--;
            l2--;
        }
        //a
        while (l1 >= 0)
        {
            int t = (a[l1] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l1--;
        }
        //b
        while (l2 >= 0)
        {
            int t = (b[l2] - '0') + shift;
            if (t >= 10)
            {
                shift = 1;
                t -= 10;
                c[len] = '0' + t;
            }
            else
            {
                shift = 0;
                c[len] = '0' + t;
            }
            len--;
            l2--;
        }
        if (shift != 0)
            c[0] = '0' + shift;
        else
            c[0] = '0';
        movePreZero(c);

    }


    //大数相乘
    void bigMul(char a[], char b[], char c[])
    {
        int i, j, t, k, val;
        int maxlen;
        int shift = 0;
        int l1 = strlen(a);
        int l2 = strlen(b);
        char tmp[MAXNUM] = { 0 };

        //结果最多是l1+l2位数
        maxlen = l1 + l2;
        c[maxlen] = 0; //字符串正常结束
        for (i = 0; i < maxlen; i++)
            c[i] = '0';

        if (l1 < l2)
        {
            //交换a和b
            strcpy(tmp, a);
            strcpy(a, b);
            strcpy(b, tmp);

            t = l1;
            l1 = l2;
            l2 = t;
        }
        for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数
        {
            shift = 0;
            memset(tmp, '0', maxlen);
            tmp[maxlen] = 0;
            for (k = 0, j = l1 - 1; j >= 0; j--, k++)
            {
                val = (b[i] - '0') * (a[j] - '0') + shift;
                if (val >= 10)
                {
                    shift = val / 10;
                    val = val % 10;
                }
                else
                    shift = 0;
                tmp[maxlen - 1 - t - k] = '0' + val;
            }
            if (shift)
                tmp[maxlen - 1 - t - k] = '0' + shift;


            //print(tmp);


            shift = 0;
            //计算c与tmp的和
            for (k = maxlen - 1; k >= 0; k--)
            {
                if (tmp[k] == 0)
                    continue;
                else
                {
                    val = c[k] - '0' + tmp[k] - '0' + shift;
                    if (val >= 10)
                    {
                        shift = val / 10;
                        val = val % 10;
                    }
                    else
                        shift = 0;
                    c[k] = '0' + val;
                }
            }
        }
        movePreZero(c);
    }

    //大数相减,成功返回1,a<b返回0
    int bigSub(char a[], char b[], char c[])
    {
        int i = 0;
        int shift = 0, val;
        int l1 = strlen(a);
        int l2 = strlen(b);
        if (l1 < l2)
        {
            c[0] = 0;
            return 0;
        }
        //b后移l1-l2位,并且前面补0
        for (i = l2 - 1; i >= 0; i--)
            b[i + l1 - l2] = b[i];
        for (i = 0; i < l1 - l2; i++)
            b[i] = '0';
        b[l1] = 0;

        //逐位相减
        i = l1 - 1;
        c[l1] = 0;
        while (i >= 0)
        {
            val = a[i] - b[i] - shift;
            if (val < 0)
            {
                val += 10;
                shift = 1;
            }
            else
                shift = 0;
            c[i] = '0' + val;
            i--;
        }
        if (shift)
        {
            c[0] = 0;
            return 0;
        }
        //去除前面的0
        movePreZero(c);
        //去除b前面的0
        movePreZero(b);
        //printf("%s",c);
        if (strlen(c) == 0)
        {
            c[0] = '0'; //留1个0
            c[1] = 0;
        }
        return 1;
    }


    
};

int main()
{
    MyInteger a("123456789");
    MyInteger b("9876543210");
    MyInteger c = a+b;
    MyInteger d = a-b;
    MyInteger e = a*b;

    cout << "a="<<a.getnum()<<endl;
    cout << "b="<<b.getnum()<<endl;
    cout << "c=a+b="<<c.getnum()<<endl;
    cout << "d=a-b="<<d.getnum()<<endl;
    cout << "e=a*b="<<e.getnum()<<endl;
    
    return 0;
}





问题是