高精度算法
1.高精度加法
思路:
高精度加法从个位数往前加,得十进一
https://www.acwing.com/problem/content/793/
#include<iostream>
#include<vector>
using namespace std;
//C=A+B;
vector<int> add(vector<int>&A,vector<int>&B){
vector<int> C;
int t=0;
int i = 0,j = 0;
while(i<A.size()){
//因为a.size()>=b.size();
t += A[i++];
//判断B[j]是否存在
if(j<B.size()) t+=B[j++];
//把个位数加入
C.push_back(t%10);
//两位数留下十位数
t/=10;
}
//判断是否需要进位
//因为加法最大进位是1
if(t>0) C.push_back(t);
return C;
}
int main(){
string a,b;
cin>>a>>b;
///使 a>=b
if(a.size()<b.size()) swap(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];
return 0;
}
2.高精度减法
https://www.acwing.com/problem/content/794/
思路:
从个位数往前减,不够向前借1
#include<iostream>
#include<vector>
using namespace std;
//C=A-B;
vector<int> sub(vector<int>&A,vector<int>&B){
vector<int>C;
int t=0,i=0,j=0;
//A>=B
while(i<A.size()){
t+=A[i++];
if(j<B.size()) t-=B[j++];
//防止t<0
C.push_back((t+10)%10);
//t<0意味着向前借了1,下一个数需要减1
if(t<0) t=-1;
else t=0;
}
//111999-111888 = 000111
//把多余的0去掉
while(C.size()>1){
if(C.back()==0) C.pop_back();
else break;
}
return C;
}
int main(){
string a,b;
cin>>a>>b;
if(a.size()<b.size()||a.size()==b.size()&&a<b){
cout<<"-";
swap(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 = sub(A,B);
for(int i=C.size()-1;i>=0;--i) cout<<C[i];
return 0;
}
3.高精度乘法
https://www.acwing.com/problem/content/795/
思路:
从个位数乘b,把t的个位数加入C中
#include<iostream>
#include<vector>
using namespace std;
//C=A*B
vector<int> mul(vector<int>&A,int B){
vector<int>C;
if(B==0) {
//特判 B出现0的情况
C.push_back(0);
return C;
}
int t,i;
for(i=t=0;i<A.size();i++){
t+=A[i]*B;
C.push_back(t%10);
t/=10;
}
//把t剩余的放入C中
while(t) {
C.push_back(t%10);
t/=10;
}
return C;
}
int main(){
string a;
int b;
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;
}
4.高精度除法
https://www.acwing.com/problem/content/796/
求商和余数
思路:
被除数<除数 被除数往后移一位
不够添0
#include<iostream>
#include<vector>
using namespace std;
vector<int> div(vector<int>&A,int B){
vector<int>C;
int t =0;
for(int i=0;i<A.size();++i){
t=t*10+A[i];
if(t>=B) C.push_back(t/B);
//如果计算过程中商为不为0
else if(C.size()!=0) C.push_back(0);
//余数
t-=(t/B)*B;
}
//出现商为0的情况
if(C.size()==0) C.push_back(0);
C.push_back(t);
return C;
}
int main(){
string a;
int b;
cin>>a>>b;
vector<int>A;
for(int i=0;i<a.size();++i) A.push_back(a[i]-'0');
auto C = div(A,b);
for(int i=0;i<C.size()-1;++i) cout<<C[i];
cout<<endl;
cout<<C.back();
return 0;
}