【算法】高精度加、减、乘、除(C++实现)

一、高精度

  当然在java中,进行高精度的加法、减法、乘法、除法运算的时候,可以通过java.math包中提供的BigInteger类提供的的方法来进行计算:

  • 加法:a.add(b);表示a+b
  • 减法:a.subtract(b);表示a-b
  • 乘法:a.multiply(b);表示a*b
  • 除法:a.divide(b);表示a/b并取整
  • 取余:a.remainder(b);表示a%b
  • 除法取余:BigInteger c[]=a.divideAndRemainder(b); a除b的商给 c[0],余数给c[1]
  • 最大公约数:a.gcd(b); a与b的最大公约数
  • 绝对值:a.abs(); 对a取绝对值
  • 取相反数:a.negate(); 对a取相反数
  • 取幂值:a.pow(n); 求a的n次方

二、高精度加法:

  给定两个正整数,计算它们的和。

   vector是stl里的动态数组,动态数组是模板库中的一个类,当元素的个数大于等于数组的大小的时候,数组的大小会变成原来的两倍,系统会从另一片区域中找出一块原来的数组的内存的两倍的空间,之后再把原来的数组拷贝到新的数组中。

   为什么用a[i]-‘0’?因为ASCII中的0-9对应48-57,但我们计算的时候想要数字,而不是它的ASCII码。所以必须让0变为0,1变为1以此类推…


                          ’0‘ - ’0‘ = 0 –> 48 - 48 = 0
                          ‘1’ - ‘0’ = 1 –> 49 - 48 = 1

#include <iostream>
#include <vector>

using namespace std;

const int N=1e6+10;

vector<int> add(vector<int> &A,vector<int> &B)
{
    vector<int> C;

    int t=0;//设置进位,初始为0
    for(int i=0;i<A.size() or i<B.size();i++)
    {
        if(i<A.size()) t+=A[i];
        if(i<B.size()) t+=B[i];
        //以上两步进行完后,t=上一轮加法的进位已经这一轮ab的和
        C.push_back(t%10);
        t/=10;
    }

    if(t) C.push_back(1); //最终t仍为1发生进位 
    return C;
}

int main()
{
    string a,b;//a,b太大所以用字符串形式写入
    vector<int> A,B;

    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); //将a[i]转换为int型,并从个位开始读入方便进位
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0'); //将b[i]转换为int型

    auto C=add(A,B); //auto编译器自动判断类型

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


}

三、高精度减法

#include<iostream>
#include<vector>

using namespace std;

//判断A是否大于等于B
bool cmp(vector<int> &A, vector<int> &B)
{
    if(A.size()!=B.size()) return 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;
}
//C=A-B
vector<int> sub(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    for(int i=0,t=0; i<A.size(); i++)
    {
        t =A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }

    while(C.size()>1 and C.back()==0) C.pop_back();//去除前导0 (002 001)
    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;
    if(cmp(A,B))
    {
        //判断A是否大于B
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    else{
        auto C=sub(B,A);
        cout<<"-";
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
 }  


四、高精度乘法

#include <iostream>
#include <vector>

using namespace std;

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

    int t=0;
    for(int i=0;i<A.size() or t;i++)
    {
        if(i<A.size()) t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }

    while(C.size()>1 and C.back()==0) C.pop_back();//去除前置0
    return C;

}

int main()
{
    string a;
    int b;

    cin>>a>>b;

    vector<int> A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');

    auto C=mul(A,b);

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

五、高精度除法

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

using namespace std;

//A/b,商是c余数是r
vector<int> div(vector<int> &A,int b,int &r)
{
    vector<int> C;
    r=0;
    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 and C.back() ==0) C.pop_back();
    return C;


}

int main()
{
    string a;
    int b;

    cin>>a>>b;

    vector<int> A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');

    int r;
    auto C=div(A,b,r);

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

    return 0;

}


猜你喜欢

转载自blog.csdn.net/m0_67463447/article/details/127825718
今日推荐