题解 | #Powerful Calculator#

Powerful Calculator

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

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

string addition(string, string);
string subtraction(string, string);
string multiplication(string, string);
int zeroCount(string&);
bool compare(string, string);

int main() {
    string num1, num2;
    while (cin >> num1 >> num2) {
        cout << addition(num1, num2) << endl;
        cout << subtraction(num1, num2) << endl;
        cout << multiplication(num1, num2) << endl;
    }
}

string addition(string a, string b) {
    bool signA = (a[0] == '-');
    bool signB = (b[0] == '-');
    bool resSign;

    if (signA) a.erase(0, 1);
    if (signB) b.erase(0, 1);

    resSign = compare(a, b) ? signA : signB;
    string num1 = compare(a, b) ? a : b; // 大数
    string num2 = compare(a, b) ? b : a; // 小数
    string result = "";

    if (signA == signB) {
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());

        int i;
        bool carry = false;
        for (i = 0; i < num2.size(); i++) {
            int bit = (num1[i] - '0') + (num2[i] - '0');
            if (carry) {
                bit++;
                carry = false;
            }

            if (bit >= 10) {
                bit -= 10;
                carry = true;
            }
            result.push_back(bit + '0');
        }
        for (; i < num1.size(); i++) {
            int bit = (num1[i] - '0');
            if (carry) {
                bit++;
                carry = false;
            }

            if (bit >= 10) {
                bit -= 10;
                carry = true;
            }
            result.push_back(bit + '0');
        }
        if (carry) result.push_back('1');

        reverse(result.begin(), result.end());
        if (resSign) result.insert(0, "-");
    } else {
        result = subtraction(num1, num2);
        if (resSign) result.insert(0, "-");
    }

    return result;
}

string subtraction(string a, string b) { // a - b
    if (a == b) return "0";
    bool signA = (a[0] == '-');
    bool signB = (b[0] == '-');
    bool resSign;

    if (signA) a.erase(0, 1);
    if (signB) b.erase(0, 1);

    string num1 = compare(a, b) ? a : b; // 大数
    string num2 = compare(a, b) ? b : a; // 小数
    string result = "";

    // num1 >= num2
    if (signA != signB) {
        resSign = signA;
        result = addition(num1, num2);
        if (resSign) result.insert(0, "-");
    } else {
        resSign = compare(a, b) ? signA : !signB;
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());

        int i;
        bool borrow = false;
        for (i = 0; i < num2.size(); i++) {
            int bit = num1[i] - num2[i];
            if (borrow) {
                bit--;
                borrow = false;
            }

            if (bit < 0) {
                bit += 10;
                borrow = true;
            }
            result.push_back(bit + '0');
        }
        for (; i < num1.size(); i++) {
            int bit = num1[i] - '0';
            if (borrow) {
                bit--;
                borrow = false;
            }

            if (bit < 0) {
                bit += 10;
                borrow = true;
            }
            result.push_back(bit + '0');
        }
        reverse(result.begin(), result.end());
        while (result[0] == '0') result.erase(0, 1);

        if (resSign) result.insert(0, "-");
    }
    return result;
}

string multiplication(string a, string b) {
    if(a == "0" || b == "0") return "0";

    bool signA = (a[0] == '-');
    bool signB = (b[0] == '-');
    bool resSign = (signA != signB);

    if(signA) a.erase(0,1);
    if(signB) b.erase(0,1);

    //去除多余0
    int zeros = zeroCount(a) + zeroCount(b);
    string zeroStr(zeros,'0');

    string num1 = compare(a,b) ? a : b; // 大数
    string num2 = compare(a,b) ? b : a; // 小数

    vector<string> numSum1;
    string temp = num1;
    numSum1.push_back("0");
    numSum1.push_back(temp);
    for(int i = 0; i < 8; i++) {
        temp = addition(temp,num1);
        numSum1.push_back(temp);
    }

    string result = "0";
    reverse(num2.begin(),num2.end());
    for(int i = 0; i < num2.size(); i++) {
        int bit = num2[i] - '0';
        string tempZeros(i,'0');
        string temp = numSum1[bit] + tempZeros;
        result = addition(result,temp);
    }

    result.append(zeroStr);
    if(resSign) result.insert(0,"-");

    return result;
}

bool compare(string a, string b) { // if a > b, return true
    bool signA = (a[0] == '-');
    bool signB = (b[0] == '-');
    if (signA != signB) return !signA;

    if (signA) a.erase(0, 1);
    if (signB) b.erase(0, 1);

    if (a.size() > b.size()) return !signA;
    else if (a.size() < b.size()) return signB;

    for (int i = 0; i < a.size(); i++) {
        if (a[i] > b[i]) return !signA;
        else if(a[i] < b[i]) return signB;
    }

    return false; // a=b
}

int zeroCount(string& s) {
    int count = 0;
    while (s.back() == '0') {
        count++;
        s.pop_back();
    }
    return count;
}

全部评论

相关推荐

会员标识
昨天 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务