代码知识点不难,数学上分情况讨论比较麻烦...
OJ还未截止,防撞故先分享思路,完整代码之后更新。
题目描述
定义大整数类CBigInteger(假设最长支持1000位),数据成员为字符串类型(用字符指针或string都可以)。成员函数或友元函数包括:
1)带参构造函数,为字符指针动态分配1001个字符空间。根据参数初始化大整数。
2) 无参构造函数,为字符指针动态分配1001个字符空间。
3)重载运算符+,实现两个大整数的加法。
4)重载运算符-,实现两个大整数的减法。
5)重载运算符*,实现两个大整数的乘法。
6)重载输入,输入大整数。
7)重载输出,输出大整数。
8)析构函数,如果字符指针,释放分配的空间,不可屏蔽。
主函数输入大整数,完成大整数的加、减、乘。主函数代码如下,请补充CBigInteger类。
输入
测试次数
每组测试数据一行: 大整数1 运算符 大整数2
输出
对每组测试数据输出表达式和计算结果,具体格式见样例。
输入样例:
3
100 * -100
-123456789 + 123456
0001 - -123
输出样例:
100 * (-100) = (-10000)
(-123456789) + 123456 = (-123333333)
1 - (-123) = 124
代码框架:
//补充CBigInteger类和头文件
/********** Write your code here! **********/
/*******************************************/
int main()
{
int t;
char op;
CBigInteger bigNum1;
CBigInteger bigNum2;
cin >> t;
while(t--)
{
cin >> bigNum1 >> op >> bigNum2;
cout << bigNum1 << " " << op << " " << bigNum2 << " = ";
if(op == '+')
cout << bigNum1 + bigNum2 << endl;
else if(op == '-')
cout << bigNum1 - bigNum2 << endl;
else if(op == '*')
cout << bigNum1 * bigNum2 << endl;
}
return 0;
}
参考思路:
// 加法运算符重载
CBigInteger operator+(const CBigInteger& other)const;// 减法运算符重载
CBigInteger operator-(const CBigInteger& other) const;// 乘法运算符重载
CBigInteger operator*(const CBigInteger& other) const;// 输入运算符重载
friend istream& operator>>(istream& in, CBigInteger& number) {
in >> number.value;
return in;
}// 输出运算符重载
friend ostream& operator<<(ostream& out, const CBigInteger& number) ;
除了输入重载较简单以外,其他都要分情况讨论:
为了简化问题,+ - * 都只计算正数的
①加法重载:
正+正 简单相加即可,考虑进位
以下三种情况,需要先取绝对值(去掉字符串的首位),再转换对应加或减
负+正 如 -123 + 23 = 23 - |-123|
正+负 如 123 + -23 = 123 - |-23|
负+负 如 -123 + -10 = -(|-123| + |-10|)
②减法重载:
正-正 ,又分为大-小、小-大,大减小简单相减去即可(考虑借位),小减大= -(大-小)
以下三种情况及小减大,需要先取绝对值(去掉字符串的首位),再转换对应加或减
负-正 如 -123 - 23 = -( |-123| + 23)
正-负 如 123 - -23 = 123 + |-23|
负-负 如 -123 - -10 = |-10| - |-123|
③乘法类似,
④输出重载:
分成四种大情况:
1.字符串首位为0: 再分为全0、非全0(如0002)
2.字符串首位为-,第二位为0
3.字符串首位为-,第二位不为0: 如(-100)
4.其他,直接打印