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

一、高精度

【算法】高精度加、减、乘、除(C++实现)_第1张图片

  当然在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 
#include 

using namespace std;

const int N=1e6+10;

vector add(vector &A,vector &B)
{
    vector C;

    int t=0;//设置进位,初始为0
    for(int i=0;i 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++实现)_第2张图片

 

#include
#include

using namespace std;

//判断A是否大于等于B
bool cmp(vector &A, vector &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 sub(vector &A,vector &B)
{
    vector C;
    for(int i=0,t=0; i1 and C.back()==0) C.pop_back();//去除前导0 (002 001)
    return C;
}


int main()
{
    string a,b;
    vector 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 C;
    if(cmp(A,B))
    {
        //判断A是否大于B
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) cout<=0;i--) cout<

四、高精度乘法

【算法】高精度加、减、乘、除(C++实现)_第3张图片

 

#include 
#include 

using namespace std;

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

    int t=0;
    for(int i=0;i1 and C.back()==0) C.pop_back();//去除前置0
    return C;

}

int main()
{
    string a;
    int b;

    cin>>a>>b;

    vector 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++实现)_第4张图片

 

#include 
#include 
#include 

using namespace std;

//A/b,商是c余数是r
vector div(vector &A,int b,int &r)
{
    vector 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 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++,开发语言)