基础算法-高精度的加、减、乘、除运算-C++实现

高精度的加、减、乘、除运算-C++实现

算法基本思想及步骤
1.用数组储存大整数,从低位到高位依次存储
2.模拟人工加、减、乘、除法

题目关键点:两数每一位相加、减、乘、除时的中间值的处理

AcWing题库-791-高精度加法

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

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的和。

数据范围
1≤整数长度≤1000000

输入样例
12
23

输出样例
35

代码

#include 
#include 

using namespace std;
//C = A + B, 满足A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
     
    vector<int> C;  //和储存在C中作为返回值

    if (A.size() < B.size()) return add(B, A);  //确保A的长度大于B

    int t = 0;  //设定中间值
    for (int i = 0; i < A.size(); i++)
    {
     
        t += A[i];
        if (i < B.size()) t += B[i];  //两数逐位相加
        C.push_back(t % 10);  //如果逐位相加的和大于10,将个位输入给C
        t /= 10;  //逐位相加的和的十位进位给下一位
    }

    if (t) C.push_back(1); //若最后得到的中间值不为0,则向最高位前进位
    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');//利用数字字符减去'0'得到数字储存在数组中

    vector<int> C = add(A, B);  //求和

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

AcWing题库-792-高精度减法

题目
给定两个正整数,计算它们的差。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤10^6

输入样例
32
11

输出样例
21

代码

#include 
#include 

using namespace std;
//比较A、B大小
bool cmp(vector<int> &A, vector<int> &B)
{
     
    if (A.size() != B.size()) return A.size() > B.size();  //若A、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];  //若A、B长度相同但A不等于B,则设置if的条件为A[i] > B[i]
    }
    return true;  //若A、B相等,则if条件为真
}
//C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
     
    vector<int> C;  //设定差储存在C中
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
     
        t = A[i] - t;
        if (i < B.size()) t -= B[i];  //中间值为A的每一位减去上一位运算时借的位,差再减去B的该位的数
        C.push_back((t + 10) % 10);  //若中间值为负,则将借位后的差存入C,若中间值为正,直接将其存入C
        if (t < 0) t = 1;  //若中间值为负,将其设为下一位运算时需要减去的借位数1
        else t = 0;  //若中间值不为负,下一位运算时不需减去借位数,即将中间值设为0
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();  //消去C中最高位可能出现的0
    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');  //利用数字字符减去'0'得到数字储存在数组中


    if (cmp(A, B))  //比较A、B大小设定if条件
    {
     
        vector<int> C = sub(A, B);  //求差
        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
        cout << endl;
    }
    else
    {
     
        vector<int> C = sub(B, A);
        cout << "-";  //若A小于B,求B-A的值,在结果前添加负号
        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
        cout << endl;
    }

    return 0;
}

AcWing题库-793-高精度乘法

题目
给定两个正整数A和B,请你计算A*B的值。

输入格式
共两行,第一行包含整数A,第二行包含整数B。

输出格式
共一行,包含A*B的值。

数据范围
1≤A的长度≤1000000
1≤B≤10000

输入样例
2
3

输出样例
6

代码

#include 
#include 

using namespace std;
//C = A * b,满足A >= 0, b > 0
vector<int> mul(vector<int> &A, int b)
{
     
    vector<int> C;  //设定乘积储存在C中
    
    int t = 0;  //设定中间值
    for (int i = 0, t = 0; i < A.size() || t; i ++ )  //设定只要进位不为0就继续循环,包含最高位向前进位
    {
     
        if (i < A.size()) t += A[i] * b;  //中间值为A的上一位与b相乘向前进位的值加上A的当前位数与b相乘的值
        C.push_back(t % 10);  //将中间值的个位存入C
        t /= 10;  //中间值删去个位,设定为需要进的位
    }
    
    while (C.size() > 1 && C.back() == 0) C.pop_back();  //消去C中最高位可能出现的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');//利用数字字符减去'0'得到数字储存在数组中

    vector<int> C = mul(A, b);  //求乘积
    
    for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
    cout << endl;

    return 0;
}

AcWing题库-794-高精度除法

题目
给定两个正整数A,B,请你计算A/B的商和余数。

输入格式
共两行,第一行包含整数A,第二行包含整数B。

输出格式
共两行,第一行输出所求的商,第二行输出所求余数。

数据范围
1≤A的长度≤1000000
1≤B≤10000

输入样例
7
2

输出样例
3
1

代码

#include 
#include 
#include 

using namespace std;
//A / b, 商是C,余数是r
vector<int> div(vector<int> &A, int b, int &r)
{
     
    vector<int> C;  //设定商储存在C中
    r = 0;
    
    for (int i = A.size() - 1; i >= 0; i -- )  //除法从高位向低位运算
    {
     
        r = r * 10 + A[i];  //中间值为上一位除完所得余数乘以10加上该位数
        C.push_back(r / b);  //将中间值除以b所得的商存入C中
        r %= b;  //中间值除以b所得的余数用于下一级运算
    }

    reverse(C.begin(), C.end());  //反转C中数的顺序得到商
    
    while (C.size() > 1 && C.back() == 0) C.pop_back();  //消去C中最高位可能出现的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');  //利用数字字符减去'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 << endl;

    return 0;
}

(模板来源于AcWing用户yxc)

你可能感兴趣的:(基础算法,算法,c++)