A02 高精度算法 减法_哔哩哔哩_bilibili
P2142 高精度减法 - 洛谷
// 高精度 O(n)
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
if(a.size()<b.size()) return true;
if(a.size()==b.size()&&a<b) return true;
return false;
}
void sub(string sa,string sb){
int la=sa.size(),lb=sb.size(),m=max(la,lb);
vector<int> a(m+1,0),b(m+1,0),c(m+1,0);
for(int i=0; i<la; i++) a[i]=sa[la-1-i]-'0';
for(int i=0; i<lb; i++) b[i]=sb[lb-1-i]-'0';
for(int i=0; i<m; i++){
if(a[i]<b[i]) a[i+1]--,a[i]+=10;
c[i]=a[i]-b[i];
}
while(!c[m] && m) m--; //去除前导零
for(int i=m;i>=0;i--) printf("%d",c[i]);
}
int main(){
string a,b; cin>>a>>b;
if(cmp(a,b)) swap(a,b),cout<<'-';
sub(a,b);
return 0;
}
// 高精度 O(n)
#include<bits/stdc++.h>
using namespace std;
struct HP{
string s;
HP(string x="0"):s(x){}; //构造
const HP operator-(const HP &t){ //重载-
string sa=s,sb=t.s,res;
int la=sa.size(),lb=sb.size(),m=max(la,lb);
vector<int> a(m+1,0),b(m+1,0),c(m+1,0);
for(int i=0; i<la; i++) a[i]=sa[la-1-i]-'0';
for(int i=0; i<lb; i++) b[i]=sb[lb-1-i]-'0';
for(int i=0; i<m; i++){
if(a[i]<b[i]) a[i+1]--,a[i]+=10;
c[i]=a[i]-b[i];
}
while(!c[m] && m) m--; //去除前导零
for(int i=m; i>=0; i--) res+=char(c[i]+'0');
return HP(res);
}
bool operator<(const HP &t){ //重载<
string b=t.s;
if(s.size()<b.size()) return true;
if(s.size()==b.size()&&s<b) return true;
return false;
}
friend istream& operator>>(istream &in,HP &t){ //重载>>
in>>t.s;
return in;
}
friend ostream& operator<<(ostream &out,const HP &t){ //重载<<
out<<t.s;
return out;
}
};
int main(){
HP a,b; cin>>a>>b;
if(a<b) swap(a,b),cout<<'-';
cout<<a-b;
return 0;
}