君清石的思念、 2022-12-10 21:09 采纳率: 0%
浏览 127
已结题

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

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2022-12-10 21:22
    关注
    获得7.50元问题酬金

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

    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;
    }
    
    
    
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月18日
  • 创建了问题 12月10日