【算法】用字符串进行高精度运算
1、字符串模拟 n 进制数相加
要想模拟几进制想加,下面代码的 n 就是几。
class Solution {
public:string addBinary(string a, string b) {int t = 0;string ret("");int cur1 = a.size() - 1;int cur2 = b.size() - 1;while(cur1 >= 0 || cur2 >= 0 || t){if(cur1 >= 0) t += a[cur1--] - '0';if(cur2 >= 0) t += b[cur2--] - '0';ret += t % n + '0'; // 不要使用头插,效率低t /= n;}reverse(ret.begin(),ret.end());return ret;}
};
2、字符串模拟十进制数相乘
模拟竖式相乘的代码不好实现,先采用“无进位相加”,最后再处理进位:
1、先把两个数逆序,这样数位和下标可以一一对应
2、把一个数的某位数与另一个数的每一位数相乘,结果 += 到一个 tmp 数组,位置的下标是相乘的两个数的下标之和。
3、处理进位,从 tmp 数组第一个元素开始,每个元素 % 10 尾插到 ret 字符串,进位是该元素 / 10,把进位加到下一个元素,再对下一个元素重复该操作
4、最后一个元素处理完了,如果还有进位,尾插到字符串
5、逆序字符串后返回。
class Solution {
public:string multiply(string num1, string num2){if(num1[0] == '0' || num2[0] == '0') return "0";reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());int m = num1.size();int n = num2.size();vector<int> tmp(m+n-1);for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){tmp[i + j] += (num1[i] - '0') * (num2[j] - '0'); }}int carry = 0;string ret("");for(int i = 0; i < m+n-1; i++){ret += (tmp[i] + carry) % 10 + '0';carry = (tmp[i] + carry) / 10;}if(carry) ret += carry + '0';reverse(ret.begin(),ret.end());return ret;}
};