带符号大整数计算器(C++实现)

本文介绍了一个用于处理带符号大整数的类的实现。该类支持加、减、乘、除等基本运算,并能够正确处理大整数的输入输出。通过对字符串进行操作实现了大整数之间的算术运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为带符号大整数定义一个类。将带符号大整数表示成两个值:一个是绝对值,用无符号大整数表示,一个是符号,用整形数表示,1表示正号,-1表示负号。

重载输入和输出运算符>>和<<。带符号大整数以-1234567890,1234567890668这样的形式来输入和输出。注意可能在输入时包含有正号,所以必须支持像+1234567890这样的输入。重载以下所有运算符,:+,-,*,/。


#include<iostream>
#include<string>
using namespace std;
class BigInter
{
private:
	string num;
	int signal;
public:
	BigInter(string num = "", int signal = 1){}
	BigInter(string a)
	{
		if (a[0] == '-')
		{
			signal = -1;
			num = a.substr(1, a.size()-1);
		}
		else
		{
			signal = 1;
			num = a;
		}
	}
	friend ostream& operator<<(ostream& out, BigInter a);
	friend istream& operator>>(istream& in, BigInter &a);
	BigInter operator+(BigInter &a);
	BigInter operator-(BigInter &a);
	BigInter operator*(const BigInter &a);
	BigInter operator/(const BigInter &a);
	~BigInter() {};
};
BigInter BigInter:: operator +(BigInter &a)
{
    string tmp = a.num;
	reverse(tmp.begin(), tmp.end());
	string tmp1 = this->num;
	reverse(tmp1.begin(), tmp1.end());
	string tmp2 = "";
	int flag = 0;
	BigInter res,tmp4,tmp3;
	tmp3.num=this->num;
	tmp3.signal = this->signal;
	tmp4.num = a.num;
	tmp4.signal = a.signal;
	int sig;
	int i;
	if (a.signal == -1 && this->signal == 1)
	{
		tmp4.signal = 1;
		return tmp3 - tmp4;
	}
	else if (a.signal == 1 && this->signal == -1)
	{
		tmp3.signal = 1;
		return tmp4-tmp3;
	}
	for ( i = 0; i < tmp.size() && i < tmp1.size(); i++)
	{
		char ch = (tmp1[i] + tmp[i] - '0' - '0'+flag) % 10+'0';
		tmp2.push_back(ch);
		
		if ((tmp1[i] + tmp[i] - '0' - '0' + flag) / 10 == 1)
		{
			flag = 1;
		}
		else
			flag = 0;
	}
	if (tmp.size() == tmp1.size() && flag == 1)
		tmp2.push_back('1');
	if (i<tmp.size())
	{
		while (i < tmp.size())
		{
			char ch = (tmp[i] - '0' + flag) % 10 + '0';
			if ((tmp[i] - '0' + flag) / 10 == 1)
			{
				flag = 1;
			}
			else
				flag = 0;
			tmp2.push_back(ch);
			i++;
		}
		if (flag == 1)
		{
			tmp2.push_back('1');
		}
		reverse(tmp2.begin(), tmp2.end());
		res.num = tmp2;
		if (a.signal == 1 && this->signal == 1)
			res.signal = 1;
		else
			res.signal = -1;
		return res;
	}
	if (i<tmp1.size())
	{
		while (i < tmp1.size())
		{
			char ch = (tmp1[i] - '0' + flag) % 10 + '0';
			if ((tmp1[i] - '0' + flag) / 10 == 1)
			{
				flag = 1;
			}
			else
				flag = 0;
			tmp2.push_back(ch);
			i++;

		}
		if (flag == 1)
		{
			tmp2.push_back('1');
		}
		reverse(tmp2.begin(), tmp2.end());
		res.num = tmp2;
		if (a.signal == 1 && this->signal == 1)
			res.signal = 1;
		else
			res.signal = -1;
		return res;
	}
	reverse(tmp2.begin(), tmp2.end());
	res.num = tmp2;
	if (a.signal == 1 && this->signal == 1)
		res.signal = 1;
	else
		res.signal = -1;
	return res;
}
BigInter BigInter:: operator -(BigInter &a)
{
	string tmp = a.num;
	string tmp1 = this->num;
	reverse(tmp1.begin(), tmp1.end());
	reverse(tmp.begin(), tmp.end());
	string tmp2 = "";
	int flag = 0,flag2=0;
	BigInter res,tmp3,tmp4;
	tmp3.num = this->num;
	tmp3.signal = this->signal;
	tmp4.num = a.num;
	tmp4.signal = a.signal;
	int sig;
	int i;
	if (a.signal == -1 && this->signal == 1)
	{
		tmp4.signal = 1;
		return tmp3+tmp4;
	}
	else if (a.signal == 1 && this->signal == -1)
	{
		tmp4.signal = -1;
		return tmp3 + tmp4;
	}
	int flag1=0;
	if (a.num.size() == this->num.size())
	{
		for (int i = a.num.size() - 1; i >= 0; i--)
		{
			if (tmp[i] > tmp1[i])
			{
				string s = tmp1;
				tmp1 = tmp;
				tmp = s;
				flag1 = 1;
				break;
			}
			else if (tmp[i] < tmp1[i])
			{
				break;
			}
		}
		
		for (i = 0; i < tmp.size() && i < tmp1.size(); i++)
		{
			char ch;
			if ((tmp1[i] - tmp[i] + flag >= 0) && (tmp1[i] - tmp[i] + flag <= 9))
			{
				ch = (tmp1[i] - tmp[i] + flag) + '0';
				flag = 0;
			}
			else
			{
				ch = (tmp1[i] - tmp[i] + 10 + flag) + '0';
				flag = -1;
			}
			tmp2.push_back(ch);
		}
		for (int i = tmp2.size() - 1; i >= 0; i--)//去除前导0
		{
			if (tmp2[i] == '0')
			{
				tmp2.erase(i);
			}
			else
				break;
		}
		reverse(tmp2.begin(), tmp2.end());
		res.num = tmp2;
		if ((a.signal == -1&&flag1==1)||(a.signal==1&&flag1==0))
		{
			res.signal = 1;
		}
		else
		{
			res.signal = -1;
		}
		return res;
	}
	if (a.num.size() > this->num.size())
	{
		string s = tmp1;
		tmp1 = tmp;
		tmp = s;
		flag2 = 1;
	}
	for (i = 0; i < tmp.size() && i < tmp1.size(); i++)
	{
		char ch;
		if ((tmp1[i] - tmp[i] + flag >= 0) && (tmp1[i] - tmp[i] + flag <= 9))
		{
			ch = (tmp1[i] - tmp[i] + flag) + '0';
			flag = 0;
		}
		else
		{
			ch = (tmp1[i] - tmp[i] + 10 + flag) + '0';
			flag = -1;
		}
		tmp2.push_back(ch);
	}
	if (i<tmp1.size())
	{
		char ch;
		int t;
		if (tmp1[i] + flag - '0' >= 0 && tmp1[i] + flag - '0' <= 9)
		{
			ch = tmp1[i] + flag;
			t = 0;
		}
		else
		{
			ch = tmp1[i] + 10 + flag;
			flag = -1;
			t = -1;
		}
		tmp2.push_back(ch);
		i++;
		while (i < tmp1.size())
		{
			if (tmp1[i] + t - '0' >= 0 && tmp1[i] + t - '0' <= 9)
			{
				ch = tmp1[i] + t;
				t = 0;
			}
			else
			{
				ch = tmp1[i] + 10 + t;
				t = -1;
			}
			tmp2.push_back(ch);
			i++;
		}
		for (int i = tmp2.size() - 1; i >= 0; i--)
		{
			if (tmp2[i] == '0')
			{
				tmp2.erase(i);
			}
			else
				break;
		}
		reverse(tmp2.begin(), tmp2.end());
		res.num = tmp2;
		if ((this->signal == 1 && a.signal == 1&&flag2==0)||(this->signal == -1 && a.signal == -1 && flag2 == 1))
		{
			res.signal = 1;
		}
		else
		{
			res.signal = -1;
		}
		return res;
	}
}
BigInter BigInter:: operator *(const BigInter &a)
{
	int flag = 0;
	BigInter res;
	res.num = "0";
	res.signal = 1;
	BigInter tmp ;
	tmp.num = "";
	tmp.signal = 1;
	string s1 = this->num, s2 = a.num;
	reverse(s1.begin(), s1.end());
	reverse(s2.begin(), s2.end());
	int i;
	for ( i = 0;  i < s2.size(); i++)
	{
		flag = 0;
		for (int j = 0; j < i; j++)
		{
			tmp.num.push_back('0');
		}
		for (int j = 0; j < s1.size(); j++)
		{
			
			char ch = ((s1[j] - '0')*(s2[i] - '0') + flag)%10 + '0';
			flag = ((s1[j] - '0')*(s2[i] - '0') + flag) / 10;
			tmp.num.push_back(ch);
		}
		if (flag != 0)
		{
			tmp.num.push_back((flag+'0'));
		}
		reverse(tmp.num.begin(), tmp.num.end());
		res.num = (res + tmp).num;
		tmp.num="";
	}
	res.signal = a.signal*this->signal;
	return res;
}
BigInter BigInter:: operator /(const BigInter &a)
{
	int flag = 1;
	BigInter tmp, tmp1;
	tmp.num = "0";
	tmp.signal = 1;
	tmp1.num = "1";
	tmp1.signal = 1;
	BigInter s1,s2;
	s1.num = this->num;
	s1.signal = 1;
	s2.signal = 1;
	s2.num = a.num;
	BigInter N,N1;
	N.signal = 1;
	N.num = "1";
	N1.signal = 1;
	N1.num = "";
	int t = s1.num.size() - s2.num.size()-1;
	while (t>0)
	{
		N.num = "1";
		N1.num = "";
		int n = (s1.num.size() - s2.num.size() - 1) > 0 ? (s1.num.size() - s2.num.size() - 1) : 0;
		for (int i = 0; i < n; i++)
		{
			N.num.push_back('0');
		}
		N1 = N * s2;
		s1 = s1 - N1;
		if (n != 0)
		{
			tmp = tmp + N;
		}
		t = s1.num.size() - s2.num.size() - 1 > 0;
	}




	while ((s1 - s2).signal!=-1)
	{
		s1 = s1 - s2;
		tmp = (tmp + tmp1);
	}
	
	tmp.signal = this->signal*a.signal;
	return tmp;
}
istream& operator>>(istream& in, BigInter &a)
{
	string s;
	in >> s;
	if (s[0] == '-')
	{
		a.num = s.substr(1, s.size() - 1);
		a.signal = -1;
	}
	else if (s[0] == '+')
	{
		a.num= s.substr(1, s.size() - 1);
		a.signal = 1;
	}
	else
	{
		a.num = s;
		a.signal = 1;
	}
	return in;
}
ostream& operator<<(ostream& out, BigInter a)
{
	if (a.signal == -1)
	{
		out << "-" << a.num << endl;;
	}
	else
	{
		out <<  a.num << endl;
	}
	return out;
}
int main()
{
	BigInter test, test1;
	cin >> test >> test1;
	cout << "test +test1" << " " << test + test1 << endl;

	cout << "test -test1" <<" "<<test-test1<<endl;
	cout <<"test *test1" << " " << test * test1 << endl;
	cout <<"test /test1" << " " << test / test1 << endl;
	getchar();
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值