题目
给出两个字符串表示正整数,求其乘积,但不得使用系统类将其转换成整数。
解法
先看代码
public static String multiply(String num1, String num2) {
String n1 = new StringBuilder(num1).reverse().toString();
String n2 = new StringBuilder(num2).reverse().toString();
int[] d = new int[num1.length()+num2.length()];7
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 mod = d[i]%10;
int carry = d[i]/10;
if(i+1<d.length){
d[i+1] += carry;
}
sb.insert(0, mod);
}
System.out.println(sb);
while(sb.charAt(0) == '0' && sb.length()> 1){
sb.deleteCharAt(0);
}
return sb.toString();
}
解析
拿"45" * "67"举例,首先把整数字符串翻转,翻转成65* 76,由于最大乘积位数就是两位的长度,就是2+2=4,所以我们用一个数组d[4]保存乘积。
先举个普通的乘积例子,但是这个例子中计算时先不进行进位,到最后在进行进位,如下面的例子最后得出 24 58 35,然后在进行进位,就得出了3015。上面代码也是这个逻辑,只不过把他先翻转过来,最后通过求余、商进行进位。
4 5
6 7
---------------
28 35
24 30
24 58 35
再看下面,由于代码下标是从0开始的,所以下面最后得出数组d=[35,58,24,0]
。
5 4
7 6
--------------
d[0]=35
d[1]=30+28=58
d[2]=24
d[3]=
然后在进行进位,最终计算如下:
d[0]=35
保留5,进3
d[1]=58+3=61
保留1,进6
d[2]=24+6=30
保留0,进3
d[3]=3
保留3。
然后由于字符串插入的时候都是插入到第0位,所以最后得出3015。