题解 | #又一版 A+B#

又一版 A+B

https://www.nowcoder.com/practice/9255c05d45b8406c9b588d7c57aa920b

本题由于数字过于大,足足有31位,所以只能用字符串处理,所以我们要学会两个函数的运用:字符串相加字符串除

针对字符串相加,有三个注意点:

1.相加的位置匹配是两个数字的最后一位,所以这里要两个指针分别指向两个数字的末尾。

2.在做完相加后,需要对较长的数字做处理,让最后的进位发挥效果。

3.最后的进位也要处理。

针对字符串除,可以看清这个代码形式,理解后会敲就行

#include <bits/stdc++.h>
using namespace std;

string add(string a, string b) {
    if (a.size() < b.size()) { //保证a是较长的
        string temp = a;
        a = b;
        b = temp;
    }
    int plus = 0;
    int i = a.size() - 1;
    int j = b.size() - 1;
    while (j >= 0) {
        int current = plus + a[i] - '0' + b[j] - '0';
        a[i] = current % 10 + '0';
        plus = current / 10;
        i--;
        j--;
    }

    while (i >= 0) {
        int current = plus + a[i] - '0';
        a[i] = current % 10 + '0';
        plus = current / 10;
        i--;
    }


    if (plus != 0) {
        char num = plus + '0';
        a = num + a;
    }
    return a;
}


int qiuyu(string sum, int m) {
    int remainder = 0;
    for (int i = 0; i < sum.size(); i++) {
        int current = remainder * 10 + sum[i] - '0';
        sum[i] = current / m + '0';
        remainder = current % m;
    }
    return remainder;

}

string divide(string sum, int m) { //字符串除
    int remainder = 0;
    for (int i = 0; i < sum.size(); i++) {
        int current = remainder * 10 + sum[i] - '0';
        sum[i] = current / m + '0';
        remainder = current % m;
    }
    int pos = 0;
    while (sum[pos] == '0') pos++;

    return sum.substr(pos);
}

int main() {
    int m;
    string a, b;
    while (cin >> m) {
        if (m == 0) break;
        cin >> a >> b;

        string sum = add(a, b);

        vector<int> num;
        while (!sum.empty()) {
            num.push_back(qiuyu(sum, m));
            sum = divide(sum, m);
        }

        for (int i = num.size() - 1; i >= 0; i--) {
            cout << num[i];
        }
        cout << '\n';
    }

}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务