A03 高精度乘法

视频链接:A03 高精度算法 乘法_哔哩哔哩_bilibili

 

Luogu P1303 A*B Problem

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

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

void mul(int a[],int b[],int c[]){ //a*b=c
  for(int i=1;i<=la;i++)
    for(int j=1;j<=lb;j++)
      c[i+j-1]+=a[i]*b[j]; //存乘积
      
  for(int i=1;i<lc;i++){
    c[i+1]+=c[i]/10;  //存进位
    c[i]%=10;         //存余数
  }
  while(c[lc]==0&&lc>1) lc--; //去0  
}
int main(){
  char A[N],B[N];
  cin>>A>>B;
  la=strlen(A); lb=strlen(B); lc=la+lb;
  for(int i=1;i<=la;i++)a[i]=A[la-i]-'0';
  for(int i=1;i<=lb;i++)b[i]=B[lb-i]-'0';
  mul(a,b,c);
  for(int i=lc;i>=1;i--) cout<<c[i];
  return 0;
}

 

#include <iostream>
using namespace std;

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

void mul(int a[],int b[],int c[]){ //a*b=c
  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(lc && c[lc]==0) lc--; //去前导0 
}
int main(){
  string sa,sb;
  cin>>sa>>sb;
  la=sa.size(); lb=sb.size(); lc=la+lb;
  for(int i=la-1; ~i; i--) a[la-1-i]=sa[i]-'0';
  for(int i=lb-1; ~i; i--) b[lb-1-i]=sb[i]-'0';
  mul(a,b,c);
  for(int i=lc; ~i; i--) cout << c[i];
}

 

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

typedef vector<int> VI;
VI A,B;

void mul(VI &A, VI &B, VI &C){
  for(int i=0; i<A.size(); i++)
    for(int j=0; j<B.size(); j++){
      C[i+j] += A[i]*B[j];   //乘积
      C[i+j+1] += C[i+j]/10; //进位
      C[i+j] %= 10;          //余数      
    }
  while(C.size()>1&&!C.back()) C.pop_back();//前导0 
}
int main(){
  string a, b;
  cin >> a >> b;
  for(int i=a.size()-1;~i;i--) A.push_back(a[i]-'0');
  for(int i=b.size()-1;~i;i--) B.push_back(b[i]-'0');
  VI C(A.size()+B.size());
  mul(A, B, C);
  for(int i=C.size()-1; ~i; i --) cout << C[i];
  return 0;
}

 

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