题解 | #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;
}

全部评论

相关推荐

02-08 15:53
门头沟学院 Java
CoderEcho:让公司知道便宜没好货
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务