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