字符串相乘
1.介绍
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
2.解决思想
首先,因为java中int类型最大值为 2147483647(2的32次方减去1), num1和num2的长度小于110,说明很可能会超出范围,不能简单地使用int类型去计算
看了一些相关的解决思想,但是都不够简单,这时发现了一位解决方法,开始思想还没有转过来,因为实际上理解是有点困难,参考思想的博客路径如下:
https://www.cnblogs.com/grandyang/p/4395356.html 这位是参考了这个博客:http://www.cnblogs.com/TenosDoIt/p/3735309.html
我特别喜欢的是看别人的解决思想,对于代码我是不想看的,上面的话就看了第一个,大致就有思路了。 因为不喜欢那种千篇一律的答案,没意思,重复的解答也没必要写。每个解答我都是觉得有必要分享的,可以帮助大家更好的学习。
我具体是解决思想是:
用int类型来存值,当然,其他的也都差不多;比如说123*23,就可以分解为三部:
第一步:3*23 第一步还可以分解为 3*3+3*20,同理,其他也可以逐步分解 第一步后,结果为0069
第二步:20*23 第二步后,结果为0529
第三步:100*23 第三步后,结果为2829
相比上面的大佬的参考的优点是:
更加直观,老实说,那位大佬的方法其实真的很简单,但是代码阅读起来并不简单,要多次处理。
个人觉得,代码的易读性还是比较重要的,尤其是在我被不少人坑过后。项目中很多代码的确炫酷,但是我觉得并没有什么用,常用代码还是好阅读最好,免得到最后一大堆炫酷的代码,自己看的脑壳痛。我很自信,在加一两句注释后,我的代码阅读性很强,也便于他人学习,共同进步。
3.代码
public static String multiply(String num1, String num2) { int n1 = num1.length(); int n2 = num2.length(); if (n1 < 1 || n2 < 1) return ""; if("0".equals(num1)||"0".equals(num2))return "0"; int[] result = new int[n1 + n2]; for (int i = n1 - 1; i >= 0; i--) { for (int j = n2 - 1; j >= 0; j--) { int index = i + j+1; int r = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); int t, k = 0; while (r+result[index] >= 10) { r = r+result[index]; t = r / 10; k = r % 10; result[index--] = k; r = t; } result[index] = r+result[index]; } } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < result.length; i++) if(!(i==0&&result[i]==0))stringBuilder.append(result[i]); return stringBuilder.toString(); }