A03 高精度乘法

A03 高精度算法 乘法_哔哩哔哩_bilibili

 

P1303 A*B Problem - 洛谷

// 高精度 O(n^2)
#include<bits/stdc++.h>
using namespace std;

void mul(string sa,string sb){
  int la=sa.size(),lb=sb.size(),m=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<la; i++)
  for(int j=0; j<lb; j++){
    c[i+j]+=a[i]*b[j];
    c[i+j+1]+=c[i+j]/10;
    c[i+j]%=10;
  }
  while(!c[m] && m) m--;
  for(int i=m; ~i; i--) cout<<c[i];
}
int main(){
  string a,b; cin>>a>>b;
  mul(a,b);
  return 0;
}

 

// 高精度 O(n^2)
#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=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<la; i++)
    for(int j=0; j<lb; j++){
      c[i+j]+=a[i]*b[j];
      c[i+j+1]+=c[i+j]/10;
      c[i+j]%=10;
    }
    while(!c[m] && m) m--; //去除前导零
    for(int i=m; i>=0; i--) res+=char(c[i]+'0');
    return HP(res);
  }
  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;
  cout<<a*b;
  return 0;
}

 

posted @ 2022-09-04 11:03  董晓  阅读(1306)  评论(0)    收藏  举报