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


查看4道真题和解析