进阶PAT 2022-12-11 18:19 采纳率: 78.4%
浏览 79
已结题

关于更大的整数问题C++/C

1.getnum函数
2.加法重载
3.减法重载
4.乘法重载
小明希望实现MyInteger类,并可以实现部分操作。

img

img

img

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2022-12-11 21:04
    关注
    
    #include <iostream>
    #include <string>
    #include <stdlib.h>
    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;
    }
     
     
     
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月21日
  • 已采纳回答 12月13日
  • 创建了问题 12月11日

悬赏问题

  • ¥15 表达式必须是可修改的左值
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题