[LeetCode]43 高精度乘法
2016-03-07 20:49
323 查看
Multiply Strings(高精度乘法)
【难度:Medium】Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
实现高精度非负整数乘法。
解题思路
按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。观看上图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下标的数字同样成立:下标i和下标j相乘的高位结果位于下标i+j处,低位位于下标i+j+1处。根据这个结果,实现高精度的乘法就变得简单了。
c++代码如下:
//高票代码版本 class Solution { public: string multiply(string num1, string num2) { int m = num1.size(); int n = num2.size(); vector<int> array(m+n); string ans = ""; for (int i = m-1; i >= 0; i--) { for (int j = n-1; j >= 0; j--) { int index1 = i + j; int index2 = i + j + 1; int sum = (num1[i]-'0')*(num2[j]-'0')+array[index2]; array[index1] += sum / 10; array[index2] = sum % 10; } } for (auto v:array) { if (ans.size() != 0 || v != 0) ans += to_string(v); } return ans.size() == 0?"0":ans; } };
//简单但低效版本 class Solution { public: string multiply(string num1, string num2) { if(num1.empty()) return num2; if (num2.empty()) return num1; if (num1.size() == 1 && num1[0] == '0') return "0"; if (num2.size() == 1 && num2[0] == '0') return "0"; string ans = ""; int count = -1; for (int i = num1.size()-1;i >= 0; i--) { string tmp = ""; int carry = 0; count++; for (int j = num2.size()-1; j >= 0; j--) { int m = (num1[i]-'0')*(num2[j]-'0')+carry; carry = m / 10; tmp = to_string(m%10)+tmp; } if (carry) tmp = to_string(carry)+tmp; int count_tmp = count; while (count_tmp) { tmp = tmp + "0"; count_tmp--; } ans = add(ans,tmp); } return ans; } string add(string num1, string num2) { if(num1.empty()) return num2; if (num2.empty()) return num1; int carry = 0; int i = num1.size()-1; int j = num2.size()-1; string ans = ""; while (i >= 0 && j >= 0) { int m = (num1[i]-'0')+(num2[j]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; i--; j--; } while (i >= 0) { int m = (num1[i]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; i--; } while (j >= 0) { int m = (num2[j]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; j--; } if (carry) ans = to_string(carry)+ans; return ans; } };
相关文章推荐
- GUIForDebug
- (原)hisi3531立体声pcm实现播放方式
- Windows下安装 使用coreseek
- Java集合面试题(40道)
- /etc/sysconfig/authconfig 文件详解
- python的性能优化
- thinking in java 04
- 下载页面
- Software Testing 1st Assignment
- 转载文章----.NET 框架浅析
- 二叉树平衡检查
- Linux 和Windows之间 Samba的配置
- ruby tips
- 浅谈Web缓存
- Android Fragment
- POJ 1887 —— Testing the CATCHER 最长下降子序列
- 在首席架构师眼里,架构的本质是……
- 【转载】【软件】Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
- Java数组中常见有点难度的练习题