PTA---C++之运算符重载---大整数求和(运算符重载) (20分)

PTA----大整数求和(运算符重载)

题目要求

BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。

重载面向BigInt类对象的运算符:

>>
<<
+

裁判测试程序样例:

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

/* 请在这里填写答案 */

int main(){
    BigInt a, b, c;
    cin>>a>>b;
   c=a+b;
    cout<<a<<"+"<<b<<"="<<c<<endl;
    return 0;
}

输入样例:

123456789
987654321

输出样例:

123456789+987654321=1111111110

--------------------------------------正文分割线-----------------------------------

分析

  1. 第一,我们要重载<<,>>,+来对该类的对象进行输入输出,还有加法
  2. 第二,我们要写一个大整数的相加,这里肯定不能使用long long int类型,因为本题要求最多100位数的相加
  3. 第三,开始编写代码

思路

1.对于这种大整型数据,对于C++唯一的方法就是使用一维数组来存(目前以我的知识面),然后加法采用小学学过的进位加法,当然除此之外,还有大整数的乘除法,本文章不做叙述;
2.对于重载+运算符,我们用一个数组存相加后的数字,然后为了输出方便,相加完毕后再用a[i]-'0’的方法来变成string类型,使得输出时变得简单。

这里我们演示一下大整型相加的算法图

这里是引用

但是需要注意的是,最后一位向加后不再进行循环了,也就是说此进位不再执行,于是在退出循环后,我们需要对进位进行判断
大整型相加核心代码:

while(j<max || k<x.max)//分别是两个数组的最大下标
        {
            c.a[i] = a[j++] + x.a[k++] + l; //每次相加
            l = c.a[i]/10; //将位数进位,由于a[i]最多为18,所以l最大为1,于是最多进1位
            c.a[i]%=10;   //保持数字在10以内
            i++;
        }

退出后进位代码:

while(l>0)
     	{
        	c.a[i] += l;     //l为进位数
        	l = c.a[i]/10;
        	c.a[i]%=10;
        	i++;
		}

3.对于重载>>运算符,由于输入时只提供cin>>a这样的形式,所以先用一个string类型的变量来接收数字,然后再对数字进行切分,放到各变量数组中,这里注意!!!string类型最后一位是最低位,也就是数的最低位,也就是数组第一个数字是string的最后一个数字
4.对于重载<<运算符,直接输出该类中的string类型即可

下面是AC代码

class BigInt
{
    int *a;
    int max;                                                //数组长度
    string num;                                             //用于输入数字,转化为数组
    public:
    BigInt()
    {
        a = new int[101];   
        max=0;
    }
    void swap_string_to_dig()
    {
        int len = num.length();
        max = len;
        for(int i=len-1;i>=0;i--)
            a[len-i-1] = num[i]-'0';
        for(int i=len;i<101;i++)
            a[i] = 0;
    }
    friend istream& operator>>(istream &is,BigInt &x)//输入
    {//注意此处为友元类型---因为是cin>>形式调用,调用的对象是istream类型的,而不是BigInt类,下同
        is>>x.num;
        return is;
    }
    friend ostream& operator<<(ostream &os,BigInt &x)//输出 
    {
        os<<x.num;
        return os;
    }
    BigInt operator+(BigInt &x)
    {
        BigInt c;
        int n,i=0,j=0,k=0;
        x.swap_string_to_dig();
        swap_string_to_dig();
		int l=0;
        while(j<max || k<x.max)
        {
            c.a[i] = a[j++] + x.a[k++] + l; //每次相加
            l = c.a[i]/10;//将位数进位,由于a[i]最多为18,所以l最大为1,于是最多进1位
            c.a[i]%=10;//保持数字在10以内
            i++;
        }
        while(l>0)
        {
        	c.a[i] += l; //l为进位数
        	l = c.a[i]/10;
        	c.a[i]%=10;
        	i++;
		}
		c.max = i;
        //c.num的转化
        for(i=c.max-1;i>=0;i--)
        c.num += c.a[i]+'0';
        return c;
    }
};

最后有一点我想说下,我这里BigInt类中定义了一个inta的指针,并且在构造函数中分配了内存,其实此程序还需要一个析构函数,来释放掉inta分配的内存空间,但是好像PTA这个编译系统有点问题,如果加上这个析构函数的话,会导致运行时出错
这里是倡议大家在实际编程过程中,不要忘记用new分配了内存,要记得delete删除

以下是该类需要加上的析构函数

~BigInt() 
    {
        delete[] a;
    }
														--end
  • 20
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值