3482.大数运算
给定两个整数 a和 b,请你依次计算并输出 a+b、a−b、a×b的结果。
注意:a,b不含前导零。
输入格式
第一行包含整数 a。
第二行包含整数 b。
输出格式
第一行输出 a+b的结果。
第二行输出 a−b的结果。
第三行输出 a×b的结果。
数据范围
|a|,|b|<10400
输入样例:
20000000000000000
4000000000000000
输出样例:
24000000000000000
16000000000000000
80000000000000000000000000000000
分析
与模版题不同,这里的高精度数据有负数,所以要注意符号以及一些特判。
高精度加法、高精度减法、高精度乘法(高精度*高精度)。
Code
#include<iostream>
#include<vector>
using namespace std;
string a,b;
vector<int> add(vector<int> &A,vector<int> &B)
{
if(A.size()<B.size())//A.size()>B.size()
return add(B,A);
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size())
t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t)C.push_back(t);
return C;
}
bool cmp(vector<int> &A,vector<int> &B)
{
if(A.size()!=B.size())
return A.size()>B.size();
for(int i=0;i<A.size();i++)
if(A[i]!=B[i])
return A[i]>B[i];
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++)
{
t=A[i]+t;
if(i<B.size())
t-=B[i];
C.push_back((t+10)%10);
if(t<0)
t=-1;
else t=0;
}
while(C.size()>1&&C.back()==0)
C.pop_back();
return C;
}
void print(vector<int> C)
{
for(int i=C.size()-1;i>=0;i--)
cout<<C[i];
cout<<endl;
return;
}
vector<int> mul(vector<int> &A,vector<int> &B)//高精度*高精度
{
vector<int> C(A.size()+B.size());
for(int i=0;i<A.size();i++)
for(int j=0;j<B.size();j++)
C[i+j]+=A[i]*B[j];
int t=0;
for(int i=0;i<C.size();i++)
{
t+=C[i];
C[i]=t%10;
t/=10;
}
if(t)
C.push_back(t);
while(C.size()>1&&C.back()==0)C.pop_back();
return C;
}
bool zero(vector<int> A)
{
if(A.size()==1&&A[0]==0)
return true;
return false;
}
bool equal(vector<int> A,vector<int> B)
{
if(A.size()==B.size())
{
for(int i=0;i<A.size();i++)
if(A[i]!=B[i])
return false;
return true;
}
return false;
}
int main()
{
cin>>a>>b;
int na=1,nb=1;
if(a[0]=='-')na=-1,a=a.substr(1);
if(b[0]=='-')nb=-1,b=b.substr(1);
vector<int> A,B;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
B.push_back(b[i]-'0');
//A+B
if(na*nb==1)//A、B同号
{
if(na==-1)
cout<<'-';
print(add(A,B));
}
else//A、B异号
{
if(na==-1)//B-A
{
if(cmp(A,B))
{
cout<<'-';
print(sub(A,B));
}
else
print(sub(B,A));
}
else//A-B
{
if(cmp(A,B))
print(sub(A,B));
else
{
cout<<'-';
print(sub(B,A));
}
}
}
//A-B
if(na*nb==1)
{
//特判 如果相等 直接输出0
//如果不特判的话 可能会输出 -0
if(equal(A,B))
cout<<0<<endl;
else
{
if(na==1)//A>0 B>0
{
if(cmp(A,B))
print(sub(A,B));
else
{
cout<<'-';
print(sub(B,A));
}
}
else//A<0 B<0
{
//B-A
if(cmp(A,B))
{
cout<<'-';
print(sub(A,B));
}
else
print(sub(B,A));
}
}
}
else
{
if(equal(A,B))
cout<<0<<endl;
else
{
if(na==-1)//A<0 B>0
{
cout<<'-';
print(add(A,B));
}
else//A>0 B<0
{
print(add(A,B));
}
}
}
//A*B
if(na*nb==1)
{
print(mul(A,B));
}
else
{
//特判 否则会有-0的输出
if(!zero(A)&&!zero(B))
cout<<'-';
print(mul(A,B));
}
return 0;
}
freetalk
主要复杂在符号的判断和一些关于“-0”输出的特判上。