题解 | #Powerful Calculator#

Powerful Calculator

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

#include<iostream>
#include<string>


using namespace std;
bool compare(string a, string b) {
    //用在大数减法里面,判断两个数谁更大,保证大数减小数
    int length_a = a.size() - 1;
    int length_b = b.size() - 1;
    bool flag;
    if (length_a < length_b) {
        //位数多的更大
        return false;
    }
    else if (length_a > length_b) {
        return true;
    }
    else {
        for (int i = 0; i <= length_a; i++) {
            if (a[i] < b[i]) {
                return false;//从大到小任一位比出大小即返回结果
            
            }
            else if(a[i]>b[i]) {
                return true;
            }
        }
        return true;
    }
}

string newplus(string a, string b) {
    //大数加法
    int length_a = a.size() - 1;
    int length_b = b.size() - 1;
    int length = min(length_a, length_b);
    string result = "",temp;
    int in = 0,length_temp;
    if (length_a<length_b) {
        //让位数更多的在前,后面处理尾串可以少写
        temp = a;
        a = b;
        b = temp;
        length_temp = length_a;
        length_a = length_b;
        length_b = length_temp;
    }
    for (int i = 0; i <= length; i++) {
        //处理共同的位数
        if (a[length_a - i] + b[length_b - i] + in - '0' > '9') {
            char curnum = a[length_a - i] + b[length_b - i] + in - 10 - '0';
		  	//两个字符相加需减掉一个‘0’字符
            in = 1;
            result = curnum + result;
        }
        else {
            char curnum = a[length_a - i] + b[length_b - i] + in - '0';
            in = 0;
            result = curnum + result;
        }
    }
    for (int i = 1; i <= length_a - length; i++) {
        //处理尾串
        if (a[length_a - length - i] + in > '9') {
            char curnum = a[length_a - length - i] + in - 10;
            in = 1;
            result = curnum + result;
        }
        else {
            char curnum = a[length_a - length - i] + in;
            in = 0;
            result = curnum + result;
        }
    }
    if (in > 0) {
        //边界条件容易遗漏:当最后两位相加结果有进位要在最前面补1
        result = '1' + result;
    }
    return result;
}

string newminus(string a, string b) {
    //大数减法
    int length_a = a.size() - 1;
    int length_b = b.size() - 1;
    int length = min(length_a, length_b);
    string result = "";
    string temp;
    int length_temp;
    bool flag=compare(a,b);//判断大小关系
    if (flag==false) {
        //让大数减小数
        temp = a;
        a = b;
        b = temp;
        length_temp = length_a;
        length_a = length_b;
        length_b = length_temp;
    }
    int in = 0;
    for (int i = 0; i <= length; i++) {
        if (a[length_a - i] - b[length_b - i] + in < 0) {
            char curnum = a[length_a - i] - b[length_b - i] + in + 10 + '0';//两字符相减需补上一个字符0
            in = -1;
            result = curnum + result;
        }
        else {
            char curnum = a[length_a - i] - b[length_b - i] + in + '0';
            in = 0;
            
            result = curnum + result;
        }
    }
    for (int i = 1; i <= length_a - length; i++) {
        //处理尾串
        if (a[length_a - length - i] + in < 0) {
            char curnum = a[length_a - length - i] + in + 10;
            in = -1;
            result = curnum + result;
        }
        else {
            char curnum = a[length_a - length - i] + in;
            in = 0;
            result = curnum + result;
        }
    }
    if (result[0] == '0') {
        //边界条件容易遗漏:减完首位可能为零,需去掉
        result.erase(0, 1);//str.erase(pos,n)从pos位置开始删去n位字符
    }
    if (flag == false) {
        result = '-' + result;//如果交换过位置,结果为负
    }
    return result;
}

string newmulti_1(string a, int b) {
    //计算大数乘一位整数的结果
    string result = "";
    for (int i = 0; i < b; i++) {
        result = newplus(result, a);//乘法转换为调用多次加法
    }
    return result;
}

string newmulti(string a, string b) {
    //大数乘法
    int length_a = a.size() - 1;
    int length_b = b.size() - 1;
    string result = "";

    for (int i = 0; i <= length_b; i++) {
        int num_b = b[length_b - i] - '0';
        //每次取右乘数的一位去乘左乘数,然后补若干位零与上次结果相加
        string a1 = newmulti_1(a, num_b);
        for (int j = 0; j < i; j++) {
            a1 += '0';
        }
        result = newplus(result, a1);
    }

    return result;
}

int main() {
    string a = "", b = "";

    cin >> a;
    cin >> b;
    cout << newplus(a, b) << endl;
    cout << newminus(a, b) << endl;
    cout << newmulti(a, b) << endl;
    return 0;

}

全部评论

相关推荐

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