题目链接,描述
https://www.lintcode.com/problem/656
以字符串的形式给定两个非负整数 num1 和 num2,返回 num1 和 num2 的乘积。
num1 和 num2 的长度都小于110。
num1 和 num2 都只包含数字 0 - 9。
num1 和 num2 都不包含任意前导零。
您不能使用任何内置的BigInteger库内方法或直接将输入转换为整数。
样例
样例1
输入:
"123"
"45"
输出:
"5535"
解释:
123 x 45 = 5535
样例2
输入:
"0"
"0"
输出:
"0"
思路
直接小学的时候学的乘法即可。注意进位,乘法的进位不仅仅是1,可能是1到8
答案
public class Solution {
/**
* @param num1: a non-negative integers
* @param num2: a non-negative integers
* @return: return product of num1 and num2
*/
public String multiply(String num1, String num2) {
//直接模拟乘法,注意进位
char[] arr1 = num1.toCharArray();
char[] arr2 = num2.toCharArray();
int n = arr1.length, m = arr2.length;
LinkedList<String> list = new LinkedList<>(); //存储每一个加数
for (int i = m - 1; i >= 0; i--) {
StringBuilder cur = new StringBuilder();
boolean isjinwei = false;
int jinweiNum = 1;//乘法的进位,比如3*8=24 进位是2
for (int j = n - 1; j >= 0; j--) {
int c1 = arr2[i] - '0', c2 = arr1[j] - '0';
int data = c1 * c2;
if (isjinwei) {
data += jinweiNum;
}
if (data < 10) {
cur.append(data);
isjinwei = false;
} else {
cur.append(data % 10);
isjinwei = true;
jinweiNum = data / 10;
}
}
if (isjinwei)
cur.append(jinweiNum);
cur = cur.reverse();
/*
123
45
-------------
615
4920
*/
for (int k = i + 1; k < m; k++) {
cur.append("0"); //4920中0就是这里补充的
}
list.add(cur.toString());
}
//System.out.println(list);
//加法计算,每次从linnkedlist中取出两个来计算,然后结果放回linkedlist,
//结果只剩2个时,相加完后返回
while (list.size() >= 2) {
String s1 = list.pollFirst();
String s2 = list.pollFirst();
char[] arr3 = s1.toCharArray();
char[] arr4 = s2.toCharArray();
//存到双向队列,方便存取,不用判断下标
LinkedList<Character> ll3 = new LinkedList<>();
LinkedList<Character> ll4 = new LinkedList<>();
for (char c : arr3) {
ll3.add(c);
}
for (char c : arr4) {
ll4.add(c);
}
StringBuilder sb = new StringBuilder();
boolean isjinwei = false;
//每次从2个双向队列取最后一个出来相加
while (!ll3.isEmpty() && !ll4.isEmpty()) {
int c1 = ll3.pollLast() - '0';
int c2 = ll4.pollLast() - '0';
int cur = c1 + c2;
if (isjinwei)
cur += 1;
if (cur < 10) {
sb.append(cur);
isjinwei = false;
} else {
sb.append(cur % 10);
isjinwei = true;
}
}
while (!ll3.isEmpty()) {
int c3 = ll3.pollLast() - '0';
if (isjinwei) {
c3 += 1;
}
if (c3 < 10) {
sb.append(c3);
isjinwei = false;
} else {
sb.append(c3 % 10);
isjinwei = true;
}
}
while (!ll4.isEmpty()) {
int c3 = ll4.pollLast() - '0';
if (isjinwei) {
c3 += 1;
}
if (c3 < 10) {
sb.append(c3);
isjinwei = false;
} else {
sb.append(c3 % 10);
isjinwei = true;
}
}
if (isjinwei)
sb.append("1");
//System.out.println(sb.reverse().toString());
list.add(sb.reverse().toString());
}
// System.out.println(list);
String s = list.get(0);
char[] chars = s.toCharArray();
StringBuilder ans = new StringBuilder();
boolean start = false;
for (char c : chars) { //去掉前导0操作
if (!start && c - '0' > 0) {
start = true; //可以开始了,
}
if (start)
ans.append(c);
}
return ans.toString().isEmpty()? "0": ans.toString();
}
}