给定两个以字符串形式表示的非负整数
num1
和num2
,返回num1
和num2
的乘积,它们的乘积也表示为字符串形式。
思路:经过学习,大致思路有两种:
第一种思路为进行每一位相乘运算时,同时处理进位,以每一位保持小于等于‘9’大于等于‘0’的数保存到char数组中。
第二种思路为先进行每一位的相乘运算,保存到char数组中,之后统一处理进位问题,此思路效率高一点。
思路一:
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")){return "0";}
char[] c = multi(num1,num2);
String res = String.copyValueOf(c);
int i=0;
while(res.charAt(i)=='0'){
i++;
}
return res.substring(i);
}
public char[] multi(String pre,String post){
int sum=0;
char[] num1 = pre.toCharArray();
char[] num2 = post.toCharArray();
char[] res = new char[num1.length+num2.length];
//初始化
for(int i=0;i<res.length;i++){
res[i]='0';
}
int mult=0;//因相乘出现的进位
int addflag=0;//因每一位数与原数组中数的加和而出现的进位
int addtmp;
for(int i=num1.length-1;i>=0;i--){
mult=0;
addflag=0;
for(int j=num2.length-1;j>=0;j--){
int tmp = (num1[i]-'0')*(num2[j]-'0')+mult;
mult = tmp/10;
tmp = tmp%10;
addtmp = res[i+j+1]-'0'+tmp+addflag;
res[i+j+1] = (char)(addtmp%10+'0');
addflag = addtmp/10;
}
res[i]+=(char)(addflag+mult);
}
return res;
}
思路二:
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")){return "0";}
char[] c = multi(num1,num2);
String res = String.copyValueOf(c);
int i=0;
while(res.charAt(i)=='0'){
i++;
}
return res.substring(i);
}
public char[] multi(String num1, String num2) {
char[] nums1 = num1.toCharArray();
char[] nums2 = num2.toCharArray();
char[] res = new char[nums1.length+nums2.length];
for(int i=0;i<res.length;i++){
res[i]='0';
}
for(int i=nums1.length-1;i>=0;i--){
for(int j=nums2.length-1;j>=0;j--){
res[i+j+1]+=(char)((nums1[i]-'0')*(nums2[j]-'0'));//将单一位置累加,进位先存着
}
}
int c=0;
for(int i=res.length-1;i>=0;i--){
res[i]+=c;
c=(res[i]-'0')/10;
res[i]=(char)((res[i]-'0')%10+'0');
}
return res;
}