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
--------------------------------------正文分割线-----------------------------------
分析
- 第一,我们要重载<<,>>,+来对该类的对象进行输入输出,还有加法
- 第二,我们要写一个大整数的相加,这里肯定不能使用long long int类型,因为本题要求最多100位数的相加
- 第三,开始编写代码
思路
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