题目

给定两个以字符串形式表示的非负整数num1num2,返回num1num2的乘积,它们的乘积也表示为字符串形式。

实现

思路1 列竖式

将列竖式计算乘法的思路按步骤编程实现出来即可。
首先我们知道当乘数nums1位数为m,被乘数nums2位数为n时,相乘的结果res最大位数为m+n,所以我们可以维护一个m+n的数组,来保存res每次更新的结果。
此外还需要观察:乘数中的某一位与被乘数中的某一位相乘时,将在res数组的哪个位置修改更新对应结果。这里可以在稿纸上画一画,最后可以看出来nums[i] x nums2[j]的结果tmp有两位,个位数位于res[i+j+1],十位数位于res[i+j]。若只有一位数则可以将十位数设为0。
(要注意res数组左边存放的是数字更大的位,右边存放的是数字更小的位,才是上面的这个关系,下面引用网上的一张图)
image.png

  1. class Solution {
  2. public:
  3. string multiply(string num1, string num2) {
  4. if(num1 == "0" || num2 == "0") {
  5. return "0";
  6. }
  7. auto res = vector<int>(num1.size()+num2.size());
  8. for (int i = num1.size()-1; i>=0; i--) {
  9. int n1 = num1.at(i) - '0'; //转数字
  10. for (int j = num2.size()-1; j>=0; j--) {
  11. int n2 = num2.at(j) - '0';
  12. // 将结果加到对应位数上
  13. res[i+j+1] += n1*n2;
  14. // 如果大于10则进位
  15. res[i+j] += res[i+j+1] / 10;
  16. res[i+j+1] = res[i+j+1] % 10;
  17. }
  18. }
  19. string ans;
  20. for( int i=0; i<res.size(); i++) {
  21. if(i==0 && res[i]==0) continue; // 如果首位不为零
  22. ans.push_back(res[i]);
  23. }
  24. // 转换为字符
  25. for (auto &c: ans) {
  26. c += '0';
  27. }
  28. return ans;
  29. }
  30. };