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