大数加减的问题,首先得了解c++的类的构建,以及操作符重载的做法。
做法如下。
//实现减法
string Diff(string& str1, string& str2)
{
int n1=str1.size(); int n2=str2.size();
int n3 = max(n1,n2);
vector<int> v3(n3);
vector<int> v1(n3,0);
vector<int> v2(n3,0);
//将字符从后往前添加到vector中
for (int i=0;i<n1;i++)
{
v1[i] = str1[n1-1-i]-'0';
}
for (int i=0;i<n2;i++)
{
v2[i] = str2[n2-1-i]-'0';
}
int flag=0;//标记,观察两数相减是正是负,以对下一位进行减一操作
for(int j=0;j<n3;j++)
{
int tmp = v1[j]-flag-v2[j];
v3[j] = tmp>=0 ? tmp : -tmp;
if (tmp<0) flag = 1;
else {flag=0;}
}
string res;
if (flag == 1) res+='-'; //如果最后一位相减为负数,则需要添加个负号
int index=-1;
//去除高位的0,记录第一个不为0的位置为index
for (int j=n3-1;j>=0;j--)
{
if (v3[j] == 0) continue;
else {index = j; break;}}
if (index==-1) return "0"; //如果都为0,那么返回0
for (int j=index;j>=0;j--)
{
res+=v3[j]+'0'; //将有效的数字添加到字符串res中
}
return res;
}
```cpp
//实现加法
string ADD(string& str1, string& str2)
{int n1 = str1.size(); int n2 = str2.size();
int n3=max(n1,n2);
vector<int> v1(n3); vector<int> v2(n3);
for (int i=0;i<n1;i++)
{
v1[i] = str1[n1-i-1] - '0';
}
for (int i=0;i<n2;i++)
{
v2[i] = str2[n2-i-1] - '0';
}
vector<int> v3(n3);
int flag=0; //标记位,记录两数相加是否大于0,如大于0,则下一位需要加上1
for (int i=0;i<n3;i++)
{
v3[i] = (v1[i]+v2[i]+flag)%10;
if (v1[i] + v2[i]+flag >= 10)
{
flag = 1;
}
else
{flag=0;}
}
if (flag ==1 ) v3.push_back(1);//如最后一位和大于9,则需要再添加个1
string res;
for (int j=v3.size()-1;j>=0;j--)
{
res += v3[j]+'0';
}
return res;
}
//构造类,实现操作符重载
class BIGnum{
public:
string str;// 这儿为了方便,直接数据为string,应该传入string*的指针会更好
BIGnum(string str0)
{
this->str = str0;}
public:
string operator+(BIGnum& num2)
{
return ADD(this->str,num2.str);}
string operator-(BIGnum& num2)
{
return Diff(this->str,num2.str);}
};
int main(){
string str1,str2;
cin>>str1;cin>>str2;
BIGnum& n1 = BIGnum(str1); BIGnum& n2 = BIGnum(str2);
string resa, resd;
resa = n1+n2;
resd = n1-n2;
cout<<resa<<endl;
cout<<resd<<endl;
return 0;
}
运行结果如下:
如果对你有帮助,欢迎三键三连。