大整数加法减法

大整数加法
求两个不超过 200200 位的非负整数的和。

输入格式
有两行,每行是一个不超过 200200 位的非负整数,可能有多余的前导 00。

输出格式
一行,即相加后的结果。结果里不能有多余的前导 00,即如果结果是 342342,那么就不能输出为 03420342。

大整数减法
求两个大的正整数相减的差。

输入格式
共 22 行,第 11 行是被减数 aa,第 22 行是减数 b(a > b)b(a>b)。每个大整数不超过 200200 位,不会有多余的前导零。

输出格式
一行,即所求的差。

#include <iostream>
#include "vector"
#include "string"
using namespace std;

// 比较函数。
bool cmpere(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> add(vector<int> &a,vector<int> &b){
    
    
    vector<int> c;
    int t = 0;  //用来表示进位。
    for (int i = 0; i < a.size() || i < b.size() || t; ++i) {
    
    
        if (i < a.size())
            t += a[i];   // i小于字符串a的长度时,循环到当前位置i时,i位置上的这个数与t相加,然后得到一个新的t。
            //cout << " t: " << t << endl;
        if (i < b.size())
            t += b[i];   // 这里的t是上面得到的t,然后与b的第i个位置相加得到另一个t。
            //cout << " tttt: " << t << endl;
        c.push_back(t % 10); // 取余数。
        t /= 10; // 取整,用于下一位的运算。
    }
    return c;
}

// 相减函数。
vector<int> subt(vector<int> &a,vector<int> &b){
    
    
    vector<int> C;
    int t = 0;  // 用于借位。
    for (int i = 0; i < a.size(); ++i) {
    
    
        t = a[i] - t;   // 左边的t等于a[i] - 0,此时减零是因为初始化为零,后面如果有借位,则应是减一。
        if (i < b.size())
            t -= b[i];  // 上面得到的t减去对应的b[i],得到另个t值。
        C.push_back((t + 10) % 10);  // 取t的余数,t为正的时候余数就是自己本身,t为负的时候余数为t+10,此时要向前一位借位。
        if (t < 0)
            t = 1;
        else t = 0;  // 判断是否借位,然后确定下个循环的时候是减一还是减零。
    }
    while (C.size() > 1 && C.back() == 0)
        C.pop_back();   //如果c的元素个数大于1,且c的最后一个是元素的值是0,则删除最后一个元素。
    return C;
}

int main(){
    
    
    string A,B;
    vector<int> a,b;

    cin >> A >> B;
    for (int i = 0; i < A.size(); ++i) {
    
    
        a.push_back(A[i] - '0');
    }
    for (int i = 0; i < B.size(); ++i) {
    
    
        b.push_back(B[i] - '0');
    }

    vector<int> C;
    if (cmpere(a,b)){
    
    
        C = subt(a,b);
    } else{
    
    
        C = subt(b,a);
        cout << " ";
    }
    for (int i = C.size() - 1; i >= 0 ; i--) {
    
    
        printf("%d",C[i]);
    }
    return 0;
}

/*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 = add(a,b);
    for (int i = C.size() - 1; i >= 0; i--) {
        printf("%d",C[i]);
    }

    std::cout << " Hello, World! " << std::endl;
    return 0;
}*/

1、首先弄清楚大整数的存储方式,是a[0]存储的是个位,a[1]存储的是十位,a[2]存储的是百位,以此类推,它是倒着存储的。
2、就是要注意vector的操作应用, .back() 是取vector的最后一个元素, .pop.back() 是删除元素。
3、要弄清楚进位和借位的注意点,进位时要前一位加一,借位时时前一位减一。

4、要知道ASCLL码的表示。
5、要删去有效数字前的零。

猜你喜欢

转载自blog.csdn.net/weixin_54501632/article/details/121668251