学弟讲算法-大数加减

1. 大数加法

例1: 无进位情况

string a = “12345” , string b = “789”

利用数组逆序存储两个数字,来求和与进位
图示:

求和结果为13134

例2:有进位情况
string a = “99769” , string b = “231”

实现代码

//大数加法
string addNum(string a, string b) {
    int xa[500] = {};
    int xb[500] = {};
    int tot[500] = {};
    for (int i = 0, size = a.size(); i < size; i++) {
        //逆序存储a
        xa[i] = a[size - i - 1] - '0';
    }
    for (int i = 0, size = b.size(); i < size; i++) {
        xb[i] = b[size - i - 1] - '0';
    }
    int len = max(a.size(), b.size());
    for (int i = 0; i < len; i++) {
        tot[i] += (xa[i] + xb[i]);
        //处理进位
        if (tot[i] > 9) {
            tot[i + 1] += 1;
            tot[i] -= 10;
        }
    }
    //保存结果
    string res = "";
    //判断有无进位的情况
    if (tot[len]) {
        res += (tot[len]+'0');
    }
    for (int i = len - 1; i >= 0; i--) {
        res += (tot[i]+'0');
    }
    return res;
}

运行结果

2. 大数减法

例3:非负情况
string a = “99729” , string b = “99231”

运算时确保被减数大于减数,最后判断是否为负数

//大数减法,a为被减数,b为减数
string subNum(string a, string b) {
    int xa[500] = {};
    int xb[500] = {};
    int tot[500] = {};
    for (int i = 0, size = a.size(); i < size; i++) {
        //逆序存储a
        xa[i] = a[size - i - 1] - '0';
    }
    for (int i = 0, size = b.size(); i < size; i++) {
        xb[i] = b[size - i - 1] - '0';
    }
    int len = max(a.size(), b.size());
    for (int i = 0; i < len; i++) {
        if(xa[i] < xb[i]){
            tot[i] -= 1;
            xa[i] += 10;
        }
        tot[i] += (xa[i] - xb[i]);
    }
    string res = "";
    //找到第一个非0的位置,消除前导0
    int index = len - 1;
    while(index >= 0 && tot[index] == 0){
        index--;
    }
    //处理相减结果为0的情况
    if(index < 0 ){
        index = 0;
    }
    for(int i = index ; i>=0 ;i--){
        res += (tot[i] + '0');
    }
    return res;
}

运行结果

猜你喜欢

转载自blog.csdn.net/qq_41452937/article/details/106876625