题解 | #Powerful Calculator#

Powerful Calculator

https://www.nowcoder.com/practice/6bc1dd2ee0ce4257821531719b8d1c83

#include <iostream>
#include <vector>
#include <stack>
using namespace std;//用vector存储两个大数
int zuodayuyou(vector<int>& s1, vector<int>& s2) {//判断s1和s2哪个大
    if (s1.size() > s2.size()) {
        return 1;
    }
    if (s1.size() < s2.size()) { return -1; }

    for (int i = 0; i < s1.size(); i++) {
        if (s1[i] > s2[i]) {
            return 1;
        }
        if (s1[i] < s2[i]) {
            return -1;
        }


    }
    return 0;
}
stack<int> add(vector<int>& s1, vector<int>& s2) {//加法
    stack<int> res;
    int i = s1.size() - 1, j = s2.size() - 1; int jinwei = 0;
    while (i >= 0 && j >= 0) {
        int k = s1[i] + s2[j] + jinwei;
        jinwei = k / 10;
        res.push(k % 10);
        i--; j--;

    }

    while (i >= 0) {
        int k1 = s1[i] + jinwei;
        jinwei = k1 / 10;
        res.push(k1 % 10);
        i--;
    }
    if (i < 0 && jinwei != 0) { res.push(jinwei); }
    return res;
}
vector<int> jieshou(stack<int> res) {//把栈转化为vector
    vector<int> s1;
    while (!res.empty()) {
        s1.push_back(res.top());
        res.pop();
    }
    return s1;
}



stack<int> subtract(vector<int>& s1, vector<int>& s2) {//减法
    stack<int> res;
    int i = s1.size() - 1, j = s2.size() - 1; int jinwei = 0;
    while (i >= 0 && j >= 0) {
        int k = s1[i] - s2[j] - jinwei;
        if (k < 0) { k = s1[i] + 10 - s2[j] - jinwei; jinwei = 1; }
        else { jinwei = 0; }
        if (i != 0 ||k != 0) 
        res.push(k);
        i--; j--;

    }
    while (i >= 0) {
        int k1 = s1[i] - jinwei;
        if (k1 < 0) { k1 = s1[i] + 10 - jinwei; jinwei = 1; }
        else { jinwei = 0; }
        if (i != 0 || k1 != 0)
        res.push(k1);
        i--;
    }


    return res;
}
vector<int> nizhi(vector<int>& ssr) {//将vector逆置
    vector<int> a;
    int n = ssr.size();
    for (int i = n - 1; i >= 0; i--) {
        a.push_back(ssr[i]);
    }
    return a;
}
vector<int> cheng(vector<int>& s1, vector<int>& s2) {//乘法
    vector<vector<int>> hang;
    int i = s1.size() - 1, j = s2.size() - 1; int jinwei = 0;
    for (int i = s2.size() - 1; i >= 0; i--) {
        int flag = 0;
        vector<int> di; int w = s2.size() - 1 - i;
        while (w > 0) {
            w--;
            di.push_back(0);
        }

        for (int j = s1.size() - 1; j >= 0; j--) {
            if (s2[i] == 0) { flag = 1; break; }
            int k = s2[i] * s1[j] + jinwei;
            jinwei = k / 10;
            di.push_back(k % 10);
            if (j == 0 && jinwei != 0) { di.push_back(jinwei); jinwei = 0; }

        }
        if (flag == 1)continue;

        di = nizhi(di);
        hang.push_back(di);
    }
    vector<int> rr1;
    for (int i = 0; i < hang.size(); i++) {
        stack<int> zz;
        if (rr1.size() > hang[i].size())
            zz = add(rr1, hang[i]);
        else
            zz = add(hang[i], rr1);
        rr1 = jieshou(zz);
    }


    return rr1;
}
void jiajian(int sig1, int sig2, vector<int>& s1, vector<int>& s2) {//判断做加法还是减法
    stack<int> sub; stack<int> adds;
    if (sig1 * sig2 == 1) {
        if (s1.size() > s2.size()) {
            adds = add(s1, s2);

        }
        else { adds = add(s2, s1); }
        if (sig1 == -1) {
            cout << '-';
        }
        while (!adds.empty()) {
            int r1 = adds.top();
            adds.pop();
            cout << r1;
        }
    }

    else {
        if (zuodayuyou(s1, s2) == 1) {
            if (sig1 == -1) {
                cout << '-';
            }
            sub = subtract(s1, s2);
            while (!sub.empty()) {
                int r = sub.top();
                sub.pop();
                cout << r;
            }

        }
        else if (zuodayuyou(s1, s2) == 0) { cout << '0'; }
        else {
            sub = subtract(s2, s1);
            if (sig2 == -1) {
                cout << '-';
            }

            while (!sub.empty()) {
                int r3 = sub.top();
                sub.pop();
                cout << r3;
            }
        }

    }
    cout << endl;
}
int main() {
    string a, b;
    while (cin >> a >> b) { //sig1,sig2分别为两个数的符号
        vector<int> s1; vector<int> s2;
        string ss1, ss2; int sig1 = 1, sig2 = 1;
        string sign1 = a.substr(0, 1); string sign2 = b.substr(0, 1);
        if (sign2 == "-") {
            sig2 = -1;
            ss2 = b.substr(1);
        }
        else {
            ss2 = b;
        }
        if (sign1 == "-") {
            sig1 = -1;
            string ss1 = a.substr(1);
        }
        else {
            ss1 = a;
        }
        for (int i = 0; i < ss1.size(); i++) {
            s1.push_back(ss1[i] - '0');
        }
        for (int i = 0; i < ss2.size(); i++) {
            s2.push_back(ss2[i] - '0');
        }
        jiajian(sig1, sig2, s1, s2);
        jiajian(sig1, sig2 * (-1), s1, s2);
        vector<int> ch;
        if (s1.size() > s2.size()) { ch = cheng(s1, s2); }
        else { ch = cheng(s2, s1); }
        if (sig1 * sig2 == -1) { cout << "-"; }
        for (int i = 0; i < ch.size(); i++) {
            cout << ch[i];
        }
        cout << endl;
      
    }
}

全部评论

相关推荐

2025年初,新的一年开始,我给自己暗暗打气,发誓今年一定要拿到offer。如今2025年即将结束,找工作仍然没有任何水花,如今的失意和落魄和年初信心满满的姿态形成鲜明对比,想必也是因为被社会毒打,认清现实了吧。先分享一下贴主的背景,本人女,本科末流985文科专业,后来保送到华五,成绩一直是班级第一,有过国奖,实习有多段头部大厂经历。发贴的直接原因是今天华为面试挂,在反思中有很多复杂的想法,包括对自身能力的怀疑、对面试官所提问题的不解、对大环境的无奈。贴主是一个说话温柔、不喜欢咄咄逼人、有点社恐的人(基本上算是人们眼中对小女生的刻板印象,所以在历次群面中基本全挂(看到大家争抢当leader、t...
在找内推的小虾米:感觉这一段经历和我好像啊,前段时间面了很多车企,面试项目经历各种被拷打,大多数都没过一面,最有希望拿offer的一个终面挂了把我干破防了,打电话给爸妈哭了一个多小时才缓过来。我也开始否定自己,否定自己的一切,包括性格,能力,成长经历。。。最后面了深圳的某家公司,面试官人都挺友好,提的问题有深度但找到切入点 ,最后hr也按岗位最高的标准给的offer,我才发现自己并没有这么不堪,只是我的能力和经验和之前的岗位要求不那么符合而已。帖主一定不要灰心,招聘的窗口期还有很长很长,保持自信扬长避短,一定有企业能发现你的闪光点,祝好。
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务