https://leetcode-cn.com/problems/multiply-strings/

    43. 字符串相乘 - 图1

    1. class Solution {
    2. public String multiply(String num1, String num2) {
    3. if (num1.equals("0") || num2.equals("0")) {
    4. return "0";
    5. }
    6. int length_1 = num1.length();
    7. int length_2 = num2.length();
    8. int[] res = new int[length_1 + length_2];
    9. for (int i = length_1 - 1; i >= 0; i--) {
    10. // 对循环里的每次遍历,需要先将字符转为数字
    11. int n_1 = num1.charAt(i) - '0';
    12. for (int j = length_2 - 1; j >= 0; j--) {
    13. // 对循环里的每次遍历,需要先将字符转为数字
    14. int n_2 = num2.charAt(j) - '0';
    15. // 从结果数组的末尾开始往前计算,需要处理进位
    16. // 计算相乘的结果,还有可能的进位
    17. int sum = res[i + j + 1] + n_1 * n_2;
    18. // 进位处理
    19. res[i + j + 1] = sum % 10;
    20. // 这里的处理是:进位加上原先值,用于上上行再下一轮加和使用
    21. // 还需要补充一下,没有这一步,就体现不出累加的概念,也就模拟不出竖式计算
    22. res[i + j] += sum / 10;
    23. }
    24. }
    25. StringBuffer resBuffer = new StringBuffer();
    26. for (int i = 0; i < length_1 + length_2; i++) {
    27. if (i == 0 && res[i] == 0) continue;
    28. resBuffer.append(res[i]);
    29. }
    30. return resBuffer.toString();
    31. }
    32. }
    1. class Solution {
    2. public String multiply(String num1, String num2) {
    3. if ("0".equals(num1) || "0".equals(num2)) {
    4. return "0";
    5. }
    6. int[] resArray = new int[num1.length() + num2.length()];
    7. // 遍历每一位
    8. for (int i = num1.length() - 1; i >= 0; i--) {
    9. int n1 = num1.charAt(i) - '0';
    10. for (int j = num2.length() - 1; j >= 0; j--) {
    11. int n2 = num2.charAt(j) - '0';
    12. // 计算乘积
    13. int product = n1 * n2;
    14. // 保存至结果数组
    15. int sum = product + resArray[i + j + 1];
    16. // 重新更新,叠加结果的个位保存至数组的 i + j + 1 的位置
    17. resArray[i + j + 1] = sum % 10;
    18. // 个位保存至数组的 i + j 的位置
    19. resArray[i + j] += sum / 10;
    20. }
    21. }
    22. // 将结果数组转为 string
    23. StringBuilder builder = new StringBuilder();
    24. // 收尾是否为 0,是的话就跳过,不是就遍历
    25. int start = resArray[0] == 0 ? 1 : 0;
    26. for (int i = start; i < resArray.length; i++) {
    27. builder.append(resArray[i]);
    28. }
    29. return builder.toString();
    30. }
    31. }
    1. class Solution {
    2. public String multiply(String num1, String num2) {
    3. if ("0".equals(num1) || "0".equals(num2)) {
    4. return "0";
    5. }
    6. // 定义输出结果,直接定义成 string,调用字符串相加
    7. String res = "0";
    8. // 从个位开始,遍历 num2 的每一位,跟 num1 相乘
    9. for (int i = num2.length() - 1; i >= 0; i--) {
    10. // 取出 num2 的当前数位,作为当前乘法的第二个乘数
    11. int n2 = num2.charAt(i) - '0';
    12. StringBuilder curResult = new StringBuilder();
    13. int carry = 0;
    14. // 因为结果是倒序,所以当前 n2 对应数位要补零,
    15. // 应该先写入 curResult,补充 n - 1 - i 个零
    16. for (int j = 0; j < num2.length() - 1 - i; j++) {
    17. curResult.append("0");
    18. }
    19. // 遍历 num1 中的每一位
    20. for (int j = num1.length() - 1; j >= 0; j--) {
    21. // 提取 num1 的当前数位,作为当前乘法的第一个乘数
    22. int n1 = num1.charAt(j) - '0';
    23. // 计算当前结果
    24. int product = n1 * n2 + carry;
    25. // 保存
    26. curResult.append(product % 10);
    27. carry = product / 10;
    28. }
    29. // 所有位数乘法计算完毕,如果有进位,需要将进位单独作为一位保存下来
    30. if (carry != 0) {
    31. curResult.append(carry);
    32. }
    33. // 此时得到的就是 num1 和 num2 中当前位 n2 的最终乘积
    34. // 将当前乘积叠加
    35. res = new AddStrings().addStrings(res, curResult.reverse().toString());
    36. }
    37. return res;
    38. }
    39. }
    40. class AddStrings {
    41. public String addStrings(String num1, String num2) {
    42. // 思路:每一位分别叠加,结果放入字符串,最后倒叙。需要来考虑进位的问题
    43. StringBuffer res = new StringBuffer();
    44. // 定义遍历 2 个字符串的初始位置
    45. int i = num1.length() - 1;
    46. int j = num2.length() - 1;
    47. // 定义进位变量
    48. int carry = 0;
    49. // 统一进位情况:只要未遍历完或者还有进位,就补零继续
    50. while (i >= 0 || j >= 0 || carry != 0) {
    51. // 取两数当前的对应数位,但是取出来可能不是数字,也就是没有数字了,要补零站位
    52. // 字符要将 ASCII 码转为数字
    53. int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
    54. int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
    55. // 对当前数位求和
    56. int sum = n1 + n2 + carry;
    57. res.append(sum % 10);
    58. carry = sum / 10;
    59. // 移动指针,遍历下一位
    60. i--;
    61. j--;
    62. }
    63. return res.reverse().toString();
    64. }
    65. }