0
点赞
收藏
分享

微信扫一扫

算法:高精度(大数)

源码之路 2022-01-14 阅读 88
算法c++

高精度

一、高精度加法(大数相加)

题目示意:

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

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

数据范围
1 ≤ 整 数 长 度 ≤ 100000 1≤整数长度≤100000 1100000
输入样例:
12
23
输出样例:
35

思路:

  • 用字符串输入的大整数
  • 将字符转化为int型 → 将字符串每一位转化成int型
  • 加法本质,从低位到高位,依次相加,a + b ≥ 10则进位
  • 每位加完后,再从高位到低位依次输出

代码:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

vector<int> add(vector<int> &A, vector<int> &B){
    if(A.size() < B.size()) return add(B, A); // 设定A.size() > B.sieze(),简便
    vector<int> C; // 存储结果
    int t = 0; // 进位(只会是0或1)
    for(int i = 0; i < A.size(); i ++){
        t += A[i]; // 当前进位的值加上A[i]
        if(i < B.size()) t += B[i]; // B[i]还存在,说明这一位还是需要相加
        C.push_back(t % 10);
        t /= 10;
    }
    if(t) C.push_back(t); // 最后判断是否还有进位,有就向前+1
    return C;
    
}

int main(){
    
    string a, b;
    cin >> a >> b;
    vector<int> A, B;
    // 应把最低位放在前面
    for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0'); // 每一位数字字符-'0'就可以得到int类型数字
    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]; //倒序输出
    
    return 0;
}

二、高精度减法(大数相减)

题目示意:

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

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

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

数据范围
1 ≤ 整 数 长 度 ≤ 105 1≤整数长度≤105 1105
输入样例:
32
11
输出样例:
21

思路:

  • 用字符串输入的大整数
  • 将字符转化为int型 → 将字符串每一位转化成int型
  • 加法本质,从低位到高位,依次相加,a - b ≤ 0则借位位
  • 每位减完后,再从高位到低位依次输出
    代码:
#include<iostream>
#include<string>
#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(); 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; // 借位,t = 0,未借位, t = 1,有借位
    
    for(int i = 0; i < A.size(); i ++){
        t = A[i] - t; // 用t计算当前位的结果
        if(i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10); // t可能是负数
        if(t < 0) t = 1; t < 0说明有借位
        else t = 0;
    }
    while(C.size() > 1 && C.back() == 0) C.pop_back(); // 去掉前导0
    
    return C;
}


int main(){
	// 输入和转化同大数相加
    string a, b;
    cin >> a >> b;
    vector<int> 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)){ // A >= B 则输出正数,否则输出负数
        auto C = sub(A, B);    
        for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
        cout << endl;
    }else{
        auto C = sub(B, A);
        cout << '-';
        for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
        cout << endl;
    }
    return 0;
}
举报

相关推荐

0 条评论