为带符号大整数定义一个类。将带符号大整数表示成两个值:一个是绝对值,用无符号大整数表示,一个是符号,用整形数表示,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;
}