Given two numbers represented as strings, return multiplication of the numbers as a string.
Note:
- The numbers can be arbitrarily large and are non-negative.
- Converting the input string to integer is NOT allowed.
- You should NOT use internal library such as BigInteger
题目:两个数字字符串相乘,求解,因为是字符串,肯定会超过Integer的最大值,但是没想到也同时超过了long的最大值,这个是后面提交后发现的。
思路:针对超过整型限制的题目,一般按照我们自己计算的思路来,例如这道题目,求两个数的积,一般都是一位一位去乘,最后把和加起来,这里我们也可以采用这种思路,同时,最后加也要用这种思路来解。我的这种解法复杂了点,但是比较好理解,先用乘数的每一位去乘被乘数,得到一个字符串数组,在把数组中全部加起来。
public String multiply(String num1, String num2) {
if(num1.equals("0") || num2.equals("0")) {
return "0";
}
String[] str = new String[num2.length()];
int k = 0;
for(int i = num2.length()-1;i >= 0;i--) {
StringBuffer s = new StringBuffer();
int n2 = num2.charAt(i) - '0';
int flag = 0;
for(int j = num1.length()-1; j >= 0; j--) {
int n1 = num1.charAt(j) - '0';
int a = (n1*n2 + flag)%10;
flag = (n1*n2 + flag)/10;
s.append(a);
}
if(flag != 0) {
s.append(flag);
}
s.reverse();
// sum = sum + Long.parseLong(s.reverse().toString())*k;
for(int z = 0; z < k ;z++) {
s.append("0");
}
str[k] = s.toString();
k++;
}
return plus(str);
}
public String plus(String[] str) {//处理数组
String s = new String();
for(int i = 0; i < str.length;i++) {
int[] sarr = stringToArray(s);
int[] starr = stringToArray(str[i]);
s = jia(sarr, starr);
StringBuffer st = new StringBuffer(s);
st.reverse();
s = st.toString();
}
return s;
}
public String jia(int[] arr1, int[] arr2) { //处理字符串相加,先把字符串转换成整型岁的数组,在一位位相加。
StringBuffer s = new StringBuffer();
int[] big;
int[] small;
if(arr1.length <= arr2.length) {
big = arr2;
small = arr1;
} else {
big = arr1;
small = arr2;
}
int flag = 0;
for(int i = 0;i < small.length;i++) {
int sum = small[i] + big[i] + flag;
if(sum >= 10) {
flag = sum/10;
} else{
flag = 0;
}
s.append(sum%10);
}
for(int i = small.length; i < big.length;i++) {
int b = big[i] + flag;
s.append(b%10);
flag = b/10;
}
if(flag > 0) {
s.append(flag);
}
return s.toString();
}
public int[] stringToArray(String s) {//字符串变成数组
int[] arr = new int[s.length()];
int j = 0;
for(int i = s.length()-1; i >=0;i--) {
arr[j++] = s.charAt(i) - '0';
}
return arr;
}
跳过了42题,看了半天实在没思路,感觉思考上被局限了,绞尽脑子也没头绪,先放过这题,后面在来做。