c++因为存储数的限制,在遇到多位数加法时需要手动模拟加法,即高精度加法。
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t=0;
for(int i=0; i<A.size()||i<B.size(); i++)
{
if(i<A.size()) t+=A[i];//t表示上一位是否有进位
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(1);
//
如果加完之后t还有那么最高位需进一位
//
return C;
}
int main()
{
string a,b;
cin>>a>>b;
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');
auto C=add(A,B);
for(int i=C.size()-1; i>=0; i--)
cout<<C[i];
}
高精度减法同理,见代码块
#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int> &A,vector<int> &B)
{
if(A.size()!=B.size())
return A.size()>B.size();
else
for(int i=A.size()-1; i>=0; 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];
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);//这里是个方便的写法,如果t<0相当于借位,如果大于0也不影响结果
if(t<0) t=-1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导零
return C;
}
int main()
{
string a,b;
cin>>a>>b;
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');
vector<int> C;
if(cmp(A,B))
C=sub(A,B);
else
C=sub(B,A),cout<<'-';//判断谁大谁小
for(int i=C.size()-1; i>=0; i--)
cout<<C[i];
}
高精度乘法就是每一位都去乘b模拟乘法,这里的b是位数较小的
#include<bits/stdc++.h>
using namespace std;
vector<int>mul(vector<int> &A, int &b)
{
vector<int> C;
int t=0;
for(int i=0; i<A.size(); i++)
{
t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导零
return C;
}
int main()
{
int b;
string a;
cin>>a>>b;
vector<int> A;
for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0');
auto c=mul(A,b);
for(int i=c.size()-1; i>=0; i--)
cout<<c[i];
return 0;
}
高精度除法要稍微麻烦一些,我们可以手动模拟一下除法,这里除法要从最高位开始。
设除数为b。
最高位除以b的余数会*10加到次高位上,而结果的当前位就是最高位/b。
#include<bits/stdc++.h>
using namespace std;
vector<int>div(vector<int> &A, int &b,int &r)
{
vector<int> C;
r=0;
for(int i=A.size()-1; i>=0; i--)
{
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导零
return C;
}
int main()
{
int b;
string a;
cin>>a>>b;
vector<int> A;
for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0');
int r;
auto c=div(A,b,r);
for(int i=c.size()-1; i>=0; i--)
cout<<c[i];
cout<<endl<<r<<endl;
return 0;
}