大数算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhq9695/article/details/81912564

目录

大数相加

大数相减

大数相乘

大数相除


大数相加

string add(string a,string b){
  int temp=0;char c;string ans="";
  while(a.size()>b.size())b='0'+b; // 补零
  while(a.size()<b.size())a='0'+a;
  for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
    c=a[i];a[i]=a[j];a[j]=c;
  }
  for(int i=0,j=b.size()-1;i<j;i++,j--){
    c=b[i];b[i]=b[j];b[j]=c;
  }
  for(int i=0;i<a.size();i++){ // 相加
    c=(a[i]-'0'+b[i]-'0'+temp)%10+'0';
    ans=c+ans;
    temp=(a[i]-'0'+b[i]-'0'+temp)/10;
  }
  if(temp!=0){ // 进位
    c=temp+'0';
    ans=c+ans;
  }
  for(int i=0;i<ans.size();i++){ // 去掉前面的零
    if(ans[i]!='0')return ans.substr(i,ans.size()-i);
  }
  return "0";
}

大数相减

string sub(string a,string b){
  int temp;char c;string ans="";
  if(a==b)return "0";
  if(a.size()<b.size() || (a.size()==b.size()&&b>a)){ans=a;a=b;b=ans;ans="";} // 使得a>b
  while(b.size()!=a.size())b='0'+b; // 补零
  for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
    c=a[i];a[i]=a[j];a[j]=c;
  }
  for(int i=0,j=b.size()-1;i<j;i++,j--){
    c=b[i];b[i]=b[j];b[j]=c;
  }
  for(int i=0;i<a.size();i++){ // 相减
    if(a[i]<b[i]){a[i]+=10;a[i+1]--;}
    c=(a[i]-b[i])+'0';
    ans=c+ans;
  }
  for(int i=0;i<ans.size();i++){ // 去掉前面的零
    if(ans[i]!='0')return ans.substr(i,ans.size()-i);
  }
  return "0";
}

大数相乘

string mul(string a,string b){
  int temp;char c;string ans="";vector<int> v(a.size()+b.size(),0);
  for(int i=0,j=a.size()-1;i<j;i++,j--){ // 转置
    c=a[i];a[i]=a[j];a[j]=c;
  }
  for(int i=0,j=b.size()-1;i<j;i++,j--){
    c=b[i];b[i]=b[j];b[j]=c;
  }
  for(int i=0;i<a.size();i++){ // 相乘
    for(int j=0;j<b.size();j++){
      v[i+j]+=(a[i]-'0')*(b[j]-'0');
    }
  }
  for(int i=0;i<v.size();i++){ // 处理进位
    v[i+1]+=v[i]/10;
    v[i]%=10;
    c=v[i]+'0';
    ans=c+ans;
  }
  for(int i=0;i<ans.size();i++){ // 去掉前面的零
    if(ans[i]!='0')return ans.substr(i,ans.size()-i);
  }
  return "0";
}

大数相除

string div(string a,string b){
  int num;char c;string temp,temp2,ans="0",ans2="";
  if(a==b)return "1";
  if(a.size()<b.size() || (a.size()==b.size()&&a<b))return "0";
  num=a.size()-b.size(); // 获取位数的差值
  for(int i=num;i>=0;i--){ // 根据每次相减,获得商
    temp=b;temp2="1";
    for(int j=0;j<i;j++){temp+='0';temp2+='0';} // 被减数、应增加的商
    while(a.size()>temp.size() || (a.size()==temp.size()&&a>=temp)){ // 相减
      a=sub(a,temp);
      ans=add(ans,temp2);
    }
  }
  ans2=a; // 余数
  for(int i=0;i<ans.size();i++){ // 去掉前面的零
    if(ans[i]!='0')return ans.substr(i,ans.size()-i);
  }
  return "0";
}

猜你喜欢

转载自blog.csdn.net/zhq9695/article/details/81912564