A02 高精度减法

视频链接:A02 高精度算法 减法_哔哩哔哩_bilibili

 

Luogu P2142 高精度减法

#include <iostream>
using namespace std;

const int N=20000;
int a[N],b[N],c[N];
int la,lb,lc;

bool cmp(int a[],int b[]){
  if(la!=lb) return la<lb;
  for(int i=la; i; i--)
    if(a[i]!=b[i]) return a[i]<b[i];
  return false;  //相等时,避免-0
}
void sub(int a[],int b[],int c[]){ //a-b=c
  for(int i=1; i<=lc; i++){
    if(a[i]<b[i]) a[i+1]--,a[i]+=10;
    c[i]=a[i]-b[i];
  }
  while(c[lc]==0&&lc>1) lc--; //去0
}
int main(){
  string sa,sb; cin>>sa>>sb;
  la=sa.size(),lb=sb.size(),lc=max(la,lb);
  for(int i=1;i<=la;i++) a[i]=sa[la-i]-'0';
  for(int i=1;i<=lb;i++) b[i]=sb[lb-i]-'0';
  if(cmp(a,b)) swap(a,b),cout<<'-';
  sub(a,b,c);
  for(int i=lc;i;i--) printf("%d",c[i]);
  return 0;
}

 

#include <iostream>
#include <vector>
using namespace std;

typedef vector<int> vi;
vi a,b,c;

bool cmp(vi &a, vi &b){
  if(a.size()!=b.size()) 
    return a.size()<b.size();
  for(int i=a.size()-1; ~i; i--)
    if(a[i]!=b[i]) return a[i]<b[i];
  return 0;
}
void sub(vi &a, vi &b, vi &c){
  int t=0;
  for(int i=0; i<a.size(); i++){
    t=a[i];
    if(i<b.size()) t-=b[i];
    if(t<0) a[i+1]--,t+=10;
    c.push_back(t);
  }
  while(c.size()>1&&!c.back())c.pop_back();
}
int main(){
  string sa,sb; cin>>sa>>sb;
  for(int i=sa.size()-1;~i;i--) a.push_back(sa[i]-'0');
  for(int i=sb.size()-1;~i;i--) b.push_back(sb[i]-'0');
  if(cmp(a, b)) swap(a,b),cout<<'-';
  sub(a,b,c);
  for(int i=c.size()-1; ~i; i--) cout<<c[i];
}

 

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