高精度加减乘除

Posted lr599909928

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度加减乘除相关的知识,希望对你有一定的参考价值。

      高精度的运算主要依靠动态数组vector和字符串实现对每一位数字的运算.

 

1.高精度加法

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
vector<int> add(vector<int> A,vector<int> B){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size() || i<B.size();i++){
        if(i<A.size())   t+=A[i];
        if(i<B.size())   t+=B[i];
        C.push_back(t%10);
        t/=10;
   }
    if(t==1)   C.push_back(1);
    return C;
}

int main(){
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-0);
    for(int i=b.size()-1;i>=0;i--)   B.push_back(b[i]-0);

    vector<int> C=add(A,B);
   for(int i=C.size()-1;i>=0;i--){
       cout<<C[i];
   }
  return 0;

}

2.高精度减法

#include <iostream>
#include <vector>

using namespace std;
bool cmp(vector<int> A, vector<int> B){
    if (A.size() == B.size()) {
        for (int i = A.size() - 1; i >= 0; i--) {
            if (A[i] != B[i])
                return A[i] > B[i];
            return true;
        }
    } else
        return A.size() > B.size();
}
vector<int> sub(vector<int> A, vector<int> B){
      vector<int> C;
      int t=0;
    int q=0;
      for(int i=0;i<A.size();i++){
        t=A[i]-q;
        if(i<B.size())
            t=t-B[i];
        C.push_back((t+10)%10);
        if(t<0)  q=1;
        else
            q=0;
      }
      while(C.size()>1 && C.back()==0)
          C.pop_back();
      return C;
}

int main(){
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-0);
    for(int i=b.size()-1;i>=0;i--)   B.push_back(b[i]-0);

    if(cmp(A,B)){
        vector<int> C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--){
            cout<<C[i];
        }
    }
    else{
       cout<<"-";
        vector<int> C=sub(B,A);
        for(int i=C.size()-1;i>=0;i--){
            cout<<C[i];
        }
    }
    return 0;
}

3.高精度乘法

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
vector<int> mul(vector<int> A,int b){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size() || t!=0;i++){
        if(i<A.size()) t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    return C;
}

int main() {
  ios::sync_with_stdio(false);
  string a;
  int b;
  vector<int> A;
  cin>>a>>b;
  for(int i=a.size()-1;i>=0;i--)    A.push_back(a[i]-0);

  vector<int> C=mul(A,b);

  for(int i=C.size()-1;i>=0;i--)
      cout<<C[i];

    return 0;
}

4.高精度除法

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
vector<int> div(vector<int> A,int b,int &r){
    r=0;
    vector<int> C;
    for(int i=A.size()-1;i>=0;i--){
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());
    while(C.size()>1 && C.back()==0)
        C.pop_back();
    return C;
}
int main() {
  ios::sync_with_stdio(false);
   string a;
   int b;
   vector<int> A;
   cin>>a>>b;
   for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-0);

   int r;
   vector<int> C=div(A,b,r);

   for(int i=C.size()-1;i>=0;i--)
       cout<<C[i];
   cout<<endl<<r;
    return 0;
}

以上是关于高精度加减乘除的主要内容,如果未能解决你的问题,请参考以下文章

js乘法精度计算代码 求解释

求助 c语言实现高精度乘法

C# 中的双倍比较精度损失,加减双精度时发生精度损失

大数高精度运算(模板)

高精度加减乘除

高精度加减乘除