高精度的加减乘除四则运算

1.高精度加法题目要求:
给定两个正整数,计算它们的和。

输入格式
共两行,每行表示一个整数。

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

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

输入样例
12
23

输出样例:
35

算法的基本步骤:
第一步:将输入的字符串按照先存个位后存高位的顺序存入到整型数组中。即数组下标为0的位置存放个位,以此类推。
第二步:申请一个整型变量用于保存进位的数字,首先初始化为0。在每次对应位数做加法时,所得结果对十取余为该位上的数字,取整为进位的数字。
第三步:按从高位到个位的顺序输出相加的结果。

算法的关键点
在存入整型数组时,应按照低位存在数组的前面,高位存在数组的后面,这种存入的方法视为了便于后续的进位。

程序代码

#include <iostream>
#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)  C.push_back(t);

    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');

    auto C = add(A, B);

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

2.高精度减法的题目要求
给定两个正整数,计算它们的差。

输入格式
共两行,每行表示一个整数。

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

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

输入样例
23
12

输出样例:
11

算法的基本步骤:
第一步:将输入的字符串按照先存个位后存高位的顺序存入到整型数组中。即数组下标为0的位置存放个位,以此类推。
第二步:判断输入的两个数的大小。若A ≥ B,直接做(A - B)的运算;若A<B,先取负号,然后再做(B - A)的运算。
第三步:申请一个整型变量用于保存借位的数字,首先初始化为0。从个位开始,依次做减法运算,该位上的数字可采用(t+10)%10 的方法综合两数相减的结果。判断 t 的正负,若为负则说明需要借位;反之,则不需要。

算法的关键点
减法运算中,借位的处理。

程序代码:

#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;
}

vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    int t = 0;//记录借位的数字
    
    for(int i = 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 && 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))
    {
        auto C = sub(A, B);
        for(int i = C.size() - 1; i >= 0; i --)  cout << C[i];
    }
    else
    {
        cout << "-";
        auto C = sub(B, A);
        for(int i = C.size() - 1; i >= 0; i --)  cout << C[i];
    }
    cout << endl;

    return 0;
}

3.高精度乘法的题目要求:
给定两个正整数A和B,请你计算A* B的值。

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

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

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

输入样例
2
3

输出样例:
6

算法的基本思路:
第一步:将输入的高精度整数按照先存个位后存高位的顺序存入到整型数组中。即数组下标为0的位置存放个位,以此类推。
第二步:申请一个整型变量用于记录进位数字。该数加上对应位上的数字与输入低精度整数对十取余为该位上的数字,取整为进位的数字。
第三步:按从高位到个位的顺序输出相加的结果。

程序代码:

#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() || t; i ++)
    {
        if(i < A.size())  t += A[i]*b;
        C.push_back(t % 10);
        t /= 10;
    }
    while(C.size() > 1 && C.back() == 0)  C.pop_back();
    return C;
}
int main()
{
    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');

    auto C = mul(A, b);

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

    return 0;
}

4.高精度除法的题目要求:
给定两个正整数A、B,请你计算A / B的商和余数。

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

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

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

输入样例:
7
2

输出样例:
3
1

算法的关键点:
除法算法的实现,申请一个变量用于存储每一步做除法的余数,将其初始化为0。除法运算是从高位向低位的运算,每次先将余数乘以十加上该位的数字,对除数取商为数组C的数据,取余为下一次运算前的余数。全部循环一遍后,由于数组C里的数据是先存储的高位,对数组C进行前后颠倒。

程序代码:

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

using namespace std;

vector<int> div(vector<int> A, int b, int &t)
{
    vector<int> C;
    t = 0;
    
    for(int i = A.size() - 1; i >= 0; i --)
    {
        t = t * 10 + A[i];
        C.push_back(t / b);
        t %= b;
    }
    reverse(C.begin(), C.end());

    while(C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
int main()
{
    string a;
    int b, t;
    vector<int> A;

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

    auto C = div(A, b, t);

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

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Quorra_chord/article/details/107178058
今日推荐