A02 高精度减法

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;
}

 

posted @ 2022-09-04 09:26  董晓  阅读(885)  评论(1)    收藏  举报