A. 【程序填空】大整数计算(运算符重载)时间限制1s内存限制128MB题目描述定义大整数类CBigInteger(假设最长支持1000位),数据成员为字符串类

题目描述

定义大整数类CBigInteger(假设最长支持1000位),数据成员为字符串类型(用字符指针或string都可以)。成员函数或友元函数包括:

1)带参构造函数,为字符指针动态分配1001个字符空间。根据参数初始化大整数。

2)  无参构造函数,为字符指针动态分配1001个字符空间。

3)重载运算符+,实现两个大整数的加法。

4)重载运算符-,实现两个大整数的减法。

5)重载运算符*,实现两个大整数的乘法。

6)重载输入,输入大整数。

7)重载输出,输出大整数。

8)析构函数,如果字符指针,释放分配的空间,不可屏蔽。

主函数输入大整数,完成大整数的加、减、乘。主函数代码如下,请补充CBigInteger类。

输入

测试次数

每组测试数据一行: 大整数1 运算符 大整数2

输出

对每组测试数据输出表达式和计算结果,具体格式见样例。

IO模式

本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。

样例查看模式 

正常显示查看格式

输入样例1 <-复制

3
100 * -100
-123456789 + 123456
0001 - -123

输出样例1

100 * (-100) = (-10000)
(-123456789) + 123456 = (-123333333)
1 - (-123) = 124

//补充CBigInteger类和头文件
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct CBigInteger {
	static const int Base = 10000;
	static const int WIDTH = 4;
	vector<int> s;

	CBigInteger(long long num = 0) { *this = num; }
	CBigInteger operator = (long long num) {
		s.clear();
		do {
			s.push_back(num % Base);
			num /= Base;

		} while (num > 0);
		return *this;
	}
	CBigInteger operator = (const string& str) {
		string str1;
		str1.resize(str.length());
		int flg = 0;
		int i, j;
		for (i = 0, j = 0; i < str.length(); i++) {
			if (str[i] != '0')flg = 1;
			if (flg) { str1[j++] = str[i]; }
		}
		str1.resize(j);
		s.clear();
		int x, len = (str1.length() - 1) / WIDTH + 1;
		for (int i = 0; i < len; i++) {
			int end = str1.length() - i * WIDTH;
			int start = max(0, end - WIDTH);
			sscanf(str1.substr(start, end - start).c_str(), "%d", &x);
			s.push_back(x);
		}
		return *this;
	}

	CBigInteger operator + (const CBigInteger& b) {
		CBigInteger c;
		c.s.clear();
		for (int i = 0, g = 0;; i++) {
			if (g == 0 && i >= s.size() && i >= b.s.size())break;
			int x = g;
			if (i < s.size())x += s[i];
			if (i < b.s.size())x += b.s[i];
			c.s.push_back(x % Base);
			g = x / Base;
		}
		return c;
	}

	CBigInteger operator-(const CBigInteger& b) const {
		CBigInteger c;
		c.s.clear();
		bool negative = false; // 是否结果为负数
		int borrow = 0;

		// 确保被减数大于等于减数
		if (*this < b) {
			negative = true;
			CBigInteger tmp = b;
			tmp = tmp - *this; // 递归调用本函数,确保两数相减结果为正数
			return tmp;
		}

		// 大数相减的主要逻辑
		for (int i = 0; i < s.size(); ++i) {
			int diff = s[i] - borrow;
			if (i < b.s.size()) {
				diff -= b.s[i];
			}
			if (diff < 0) {
				diff += Base;
				borrow = 1;
			}
			else {
				borrow = 0;
			}
			c.s.push_back(diff);
		}

		// 移除结果前导零
		while (c.s.size() > 1 && c.s.back() == 0) {
			c.s.pop_back();
		}

		// 如果结果为负数,在结果前添加负号
		if (negative) {
			c.s.back() *= -1;
		}

		return c;
	}
	CBigInteger operator *(long long num)const {
		CBigInteger c;
		c.s.clear();
		int i;
		long long g = 0;
		for (i = 0;; i++) {
			long long x = g;
			if (g == 0 && i >= s.size())break;
			if (i < s.size())x += s[i] * num;
			c.s.push_back(x % Base);
			g = x / Base;
		}
		return c;
	}

	CBigInteger operator *(const CBigInteger& b) const {
		CBigInteger C;
		C.s.clear();
		int i;
		for (i = 0; i < s.size(); i++) {
			CBigInteger D;
			D = b * s[i];
			int j = i;
			while (j--) {
				D = D * Base;

			}
			C = C + D;
		}
		return C;
	}

	bool operator < (const CBigInteger& b) const {
		if (s.size() != b.s.size())return s.size() < b.s.size();
		int i;
		for (i = s.size() - 1; i >= 0; i--) {
			if (s[i] != b.s[i])
				return s[i] < b.s[i];
		}
		return false;
	}
	bool operator >(const CBigInteger& b)const { return b < *this; }
	bool operator <=(const CBigInteger& b)const { return !(b < *this); }
	bool operator >=(const CBigInteger& b)const { return !(*this < b); }
	bool operator !=(const CBigInteger& b)const { return (b < *this) || (*this < b); }
	bool operator ==(const CBigInteger& b) const { return !(b < *this) && !(*this < b); }

};
ostream& operator <<(ostream& out, const CBigInteger& x) {
	if (x.s.back() < 0)
	{
		out << "(" << x.s.back() ;
		for (int i = x.s.size() - 2; i >= 0; i--) {
		char buf[20];
		sprintf(buf, "%04d", x.s[i]);
		out << buf;	
	}
		out << ")";
	}
	else
	{
out << x.s.back();
for (int i = x.s.size() - 2; i >= 0; i--) {
	char buf[20];
	sprintf(buf, "%04d", x.s[i]);
	out << buf;
}
	}
	
	return out;
}
istream& operator >> (istream& in, CBigInteger& x) {
	string s;
	if (!(in >> s)) return in;
	x = s;
	return in;

}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值