Solution in Java:
public class Solution {
public String multiply(String num1, String num2) {
//String result = "";
int carry = 0;
char[] result = new char[num1.length()+num2.length()];
for(int n=0; n<result.length; n++){
result[n] = '0';<span style="white-space:pre"> </span>//initialize is necessary to compute the result
}
for(int i=0; i<num1.length(); i++){
int val1 = num1.charAt(num1.length()-1-i)-'0'; //need to reverse the index of string
carry=0;<span style="white-space:pre"> </span>//for each outer loop, initialize the value of carry
for(int j=0; j<num2.length(); j++){
int digi = i+j;
int val2 = num2.charAt(num2.length()-1-j)-'0'; //need to reverse the index of string
int sum = val1*val2+carry;
int exist = result[result.length-1-digi]-'0';
sum = sum+exist;
int cur = sum%10;
carry = sum/10;
result[result.length-1-digi] = (char)(cur+'0');
}
<span style="white-space:pre"> </span> //check if the highest digit has carry. If it is, continue to compute
int index = num2.length() + i;
while(carry!=0){
int cur = (result[result.length-1-index]-'0' + carry)%10;
result[result.length-1-index] = (char)(cur+'0');
index++;
carry = cur/10;
}
}
<span style="white-space:pre"> </span>//omit the '0' from the high digits
int n=0;
while(n<result.length&&result[n]=='0') n++;
if(n==result.length) return "0";
String res = String.valueOf(result);
return res.substring(n);
}
}
Note:
1. 就是所谓的大数乘法,用字符串表示数字
2. 因为在计算的过程中需要修改字符串相应位置的字符,用字符串不好操作,所以暂用char array储存结果,因为长为n1的str1与长为n2的str2相乘,其最高位为n1+n2, 所以char array大小为n1+n2。
3. 将两个字符串一位一位相乘,采用双循环,记下每次的进位数,每一位的结果要加上该位的进位数和该位已存在于result数组中的结果。
4. 每次内循环结束后,需要查看最高位上是否有进位,如果则要一直往上加。
5. 对于最终的结果,需要从高位到低位查看是否为‘0’,即将高位的‘0’消去,如果全为0,则结果为0。
6. 因为字符串的储存顺序是从高位到低位,所以遍历时要重新计算index,因为计算时顺序为从低位到高位。
7. int转换为char:(char)(i+‘0’) char转换为int:chr-'0'
String转换为char[]; str.toCharArray(); char[]转换为String:String.valueOf(char[])