classSolution { public: string addtion(string& num1, string& num2){ int m = num1.size()-1, n = num2.size()-1; int c = 0; string ret; while(m>=0 || n>=0 || c){ int a = m>=0 ? num1[m]-'0' : 0; // 越界定0技巧 int b = n>=0 ? num2[n]-'0' : 0; // 越界定0技巧 int s = a + b + c; ret.push_back('0' + s % 10); c = s / 10; --m, --n; } reverse(ret.begin(), ret.end()); // 反转 return ret; } string multiply(string num1, string num2){ if(num1=="0" || num2=="0") return"0"; string res = "0"; int cnt = 0; // 记录表示每次乘完左移的0的个数 int m = num2.size()-1; while(m >= 0){ int n = num1.size()-1; int b = num2[m] - '0'; int c = 0; string ret(cnt, '0'); // 初始化"左移"0 while(n>=0 || c){ int a = n>=0 ? num1[n]-'0' : 0; // 越界定0技巧 int s = a * b + c; ret.push_back('0' + s % 10); c = s / 10; --n; } reverse(ret.begin(), ret.end()); // 反转 res = addtion(res, ret); --m, ++cnt; } return res; } };
1.2 优化竖式 (LC高赞)(很难想到啊)
num1[i] x num2[j] 的结果为 tmp(位数为两位,”0x”,”xy”的形式),其第一位位于 res[i+j],第二位位于 res[i+j+1]。