题目:给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理
思路:高精度乘法
提交的代码:
网上大神的代码。先把字符串进行反转,然后对应位置相乘处理好进位。
class Solution {
public String multiply(String num1, String num2) {
// 先把string翻转
String n1 = new StringBuilder(num1).reverse().toString();
String n2 = new StringBuilder(num2).reverse().toString();
int[] d = new int[n1.length()+n2.length()]; // 构建数组存放乘积
for(int i=0; i<n1.length(); i++)
{
for(int j=0; j<n2.length(); j++)
{
d[i+j] += (n1.charAt(i)-'0') * (n2.charAt(j)-'0'); // 在正确位置累加乘积
}
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<d.length; i++)
{
int digit = d[i]%10; // 当前位
int carry = d[i]/10; // 进位
if(i+1<d.length)
{
d[i+1] += carry;
}
sb.insert(0, digit); // prepend
} // 移除前导零
while(sb.charAt(0)=='0' && sb.length()>1)
{
sb.deleteCharAt(0);
}
return sb.toString();
}
}
补充一点内容
JAVA 中 Stringbuffer 有append( )方法
Stringbuffer其实是动态字符串数组
append( )是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号
跟String不同的是Stringbuffer是放一起的
String1+String2 和Stringbuffer1.append("yyyy")虽然打印效果一样,
但在内存中表示却不一样
String1+String2 存在于不同的两个地址内存
Stringbuffer1.append(Stringbuffer2)放再一起。
StringBuffer是线程安全的,多用于多线程。
执行最快代码:
高精度乘法,类似于手算乘法。将字符串转化为字符数组,对应位置相乘,同时注意进位的处理。可以余弦估计下结果的最大长度,比如说两个字符串的长度之和。
(1)把字符串转换为整数数组。首先利用toCharArray()转化为字符数组;然后数组中的每一个元素减去‘0’字符0变为整数
(2)把整数数组转化为字符串。创建StringBuffer,使用函数append()将整数数组中的元素依次添加到StringBuffer中,然后利用toString()方法转化为字符串。
class Solution {
public String multiply(String num1, String num2) {
char[] nums1 = num1.toCharArray();
char[] nums2 = num2.toCharArray();
int m = nums1.length;
int n = nums2.length;
int[] result = new int[m + n];
for (int i = 0; i < m; i++) {
nums1[i] -= '0';
}
for (int i = 0; i < n; i++) {
nums2[i] -= '0';
}
int i,j,k;
for (i = 0; i < m; i++) {
int carry = 0;
for (j = 0; j < n; j++) {
int n1 = nums1[m - 1 -i];
int n2 = nums2[n - 1 -j];
result[i+j] = result[i+j] + n1 * n2 + carry;
carry = result[i+j] / 10;
result[i+j] = result[i+j] % 10;
}
k = i + j;
while(carry != 0){
result[k] = result[k] +carry;
carry = result[k] / 10;
result[k] = result[k] % 10;
k++;
}
}
int p = m + n - 1;
StringBuilder sb = new StringBuilder(p);
while(p > 0 && result[p] == 0){
p--;
}
while(p >= 0){
sb.append(result[p]);
p--;
}
return sb.toString();
}
}