高精度加减法
注意:1.高精度问题都倒着存,便于进位 2.读入的时候最后不要忘记-‘0’
>>加法实例
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
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];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B,C;
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');
C=add(A,B);
for(int i = C.size()-1; i>=0; i--) cout<<C[i];
puts(""); //表换行
}
加法中的优化
vector<int> add(vector<int> A,vector<int> B)
{
if(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;
>>减法实例
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
int cmp(vector<int> A,vector<int> B) //比较A,B谁大
{
if(A.size()>B.size()) return 1;
else if(A.size()<B.size()) return -1;
for(int i = A.size()-1;i>=0;i--)
{
if(A[i] > B[i]) return 1;
else if (A[i]<B[i]) return -1;
}
return 0;
}
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);
if(t<0) t=-1;
else t=0;
}
while(C.size()>1 && C.back() == 0) C.pop_back(); //处理像0012有多余的0的情况
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B,C;
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');
if(cmp(A,B)>=0) C=sub(A,B);
else C=sub(B,A),cout<<"-";
for(int i = C.size()-1; i>=0;i--) cout<<C[i];
puts("");
return 0;
}
vj:A高精度加减法
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
char c;
char a[510],b[510];
int t;
string a1,b1;
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];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
return C;
}
int cmp(vector<int> A,vector<int> B)
{
if(A.size()>B.size()) return 1;
else if(A.size()<B.size()) return -1;
for(int i = A.size()-1; i>=0; i--)
{
if(A[i]>B[i]) return 1;
else if(A[i]<B[i]) return -1;
}
return 0;
}
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);
if(t<0) t=-1;
else t=0;
}
while(C.size()>1 && C.back()==0) C.pop_back();
return C;
}
int main()
{
int n;
cin >> n;
while(n--)
{
memset(a,0,sizeof(a)); //***
memset(b,0,sizeof(b));
string s;
cin >> s;
int p=0;
int rise=0;
for(int i = 0;;i++)
{
if (s[i] > 45)
a[i]=s[i];
else
{
c = s[i];
p = i + 1;
break;
}
}
//a为符号前的数字 c为符号
for(int j=p;j<s.size();j++) b[rise++]=s[j];
//b为符号后的数字
a1=a,b1=b;
vector<int> A,B,C;
for(int i = a1.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i = b1.size()- 1;i>=0;i--) B.push_back(b[i]-'0');
if(c=='+') C=add(A,B);
else
{
if(cmp(A,B)>=0) C=sub(A,B);
else C=sub(B,A),cout<<"-";
}
a1.clear(); //***
b1.clear();
for(int i = C.size()-1; i>=0; i--) cout<<C[i];
puts("");
}
return 0;
}
***一定要先初始化a,b;最后还要清空a1,b1