题目
题目链接:
https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571
思路
1.直接模拟乘法,被乘数的每一位和乘数相乘得到一个数字字符串,
此时的进位不在是1,可能是2,3。。。。
2.多个数字字符串相加的结果就是答案
参考答案
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
if (s.equals("0") || t.equals("0")) return "0";
//直接模拟乘法,注意进位
char[] arr1 = s.toCharArray();
char[] arr2 = t.toCharArray();
int n = arr1.length, m = arr2.length;
LinkedList<String> ll = new LinkedList<>();
for (int i = n - 1; i >= 0 ; i--) {
StringBuilder sb = new StringBuilder();
boolean jinwei = false;
int jinweiNum = 0;
int a = Integer.valueOf(arr1[i] + "");
for (int j = m - 1; j >= 0 ; j--) {
int b = Integer.valueOf(arr2[j] + "");
int mul = a * b;
if (jinwei) {
mul += jinweiNum;
}
if (mul < 10) {
jinwei = false;
sb.append(mul);
} else {
jinweiNum = mul / 10;
sb.append(mul % 10);
jinwei = true;
}
}
if (jinwei) sb.append(jinweiNum);
sb = sb.reverse();
for (int j = i + 1; j < n ; j++) {
sb.append(0);
}
//System.out.println(sb.toString());
ll.addLast(sb.toString());
}
/*
4 2 3
4 5
-------------------
2 1 1 5
1 6 9 2 0
*/
//模拟大整数加法
while (ll.size() >=
2) { //每次取出2个数来相加,再把结果放进队列
String s1 = ll.pollLast();
String s2 = ll.pollLast();
char[] arr3 = s1.toCharArray();
char[] arr4 = s2.toCharArray();
boolean jinwei = false;
int len1 = arr3.length - 1, len2 = arr4.length - 1;
StringBuilder sb = new StringBuilder();
while (len1 >= 0 && len2 >= 0) {
int a = Integer.valueOf(arr3[len1] + "");
int b = Integer.valueOf(arr4[len2] + "");
int ab = a + b;
if (jinwei) ab += 1;
if (ab < 10) {
jinwei = false;
sb.append(ab);
} else {
sb.append(ab % 10);
jinwei = true;
}
len1--;
len2--;
}
while (len1 >= 0) {
int a = Integer.valueOf(arr3[len1] + "");
if (jinwei) a += 1;
if (a < 10) {
jinwei = false;
sb.append(a);
} else {
jinwei = true;
sb.append(a % 10);
}
len1--;
}
while (len2 >= 0) {
int b = Integer.valueOf(arr4[len2] + "");
if (jinwei) b += 1;
if (b < 10) {
jinwei = false;
sb.append(b);
} else {
jinwei = true;
sb.append(b % 10);
}
len2--;
}
if (jinwei) sb.append(1);
ll.addLast(sb.reverse().toString()); //2个数相加的结果再放进队列中
}
//System.out.println(ll);
return ll.get(0);
}
}