public class MultiplyStrings {
//方法一:基于字符串相加的竖式乘法
public String multiply1(String num1, String num2) {
//有一个数为0,结果就是0
if(num1.equals("0")||num2.equals("0")) return "0";
//定义输出结果,直接定义为String,调用字符串相加方法
String result = "0";
//遍历num2的每一位,而且是从个位开始,跟num1相乘,并叠加计算结果
for(int i = num2.length()-1;i>=0;i--){
//取出num2的当前数位,作为当前乘法的第二个乘数
int n2 = num2.charAt(i)-'0';
//用一个stringbuffer保存乘积结果
StringBuffer curResult = new StringBuffer();
int carry = 0;//定义进位
//1.因为结果是倒序,所以当前n2对应的树为要补的0,应该先写入curResult,补n-1-i个0
for (int j = 0; j < num2.length()-1-i; j++) {
curResult.append("0");
}
//2.遍历num1中的每一位,与n2相乘并叠加
for (int j = num1.length()-1; j >=0; j--) {
//取出num1的当前数位,作为当前乘法的第一个乘数
int n1 = num1.charAt(j)-'0';
//计算当前数位的乘积结果
int product = n1*n2+carry;
curResult.append(product%10);
carry = product/10;
}
//3.所有数位乘法计算完毕,如果有进位,需要将进位单独作为一位保存下来
if(carry!=0){
curResult.append(carry);
}
//现在就得到了num1和当前位n2的最终乘积
//4.将当前成绩叠加到result中
result= addStrings(result,curResult.reverse().toString());
}
return result;
}
//方法二:用数组保存每次结果
public String multiply(String num1, String num2) {
//有一个数为0,结果就是0
if(num1.equals("0")||num2.equals("0")) return "0";
//定义一个数组,保存计算结果的每一位
int[] resultArray = new int[num1.length()+num2.length()];
//遍历num1和num2的每个数位,做乘积,然后找到对应数位,填入结果数组
for (int i = num1.length()-1; i >=0 ; i--) {
int n1 = num1.charAt(i)-'0';
for (int j = num2.length()-1; j >=0 ; j--) {
int n2 = num2.charAt(j)-'0';
//计算乘积
int product = n1*n2;
//保存到结果数组
int sum = product+resultArray[i+j+1];
resultArray[i+j+1] = sum%10;//叠加结果的个位保存到i+j+1位置
resultArray[i+j] += sum/10;
}
}
//将结果数组转成String输出
StringBuffer result = new StringBuffer();
int start = resultArray[0]==0?1:0;//如果最高位为0,从下标1开始遍历
for (int i = start; i < resultArray.length; i++) {
result.append(resultArray[i]);
}
return result.toString();
}
public String addStrings(String num1, String num2) {
//定义一个StringBuffer,保存最终的结果
StringBuffer result = new StringBuffer();
//定义两个字符串的初始位置
int i = num1.length()-1;
int j = num2.length()-1;
int carry = 0;//保存当前的进位
//从个位开始依次遍历所有数位,只要还有数没有计算,就继续,其他树位为0
while (i>=0||j>=0||carry!=0){
//取两数当前的对应树位
int n1 = i>=0?num1.charAt(i)-'0':0;
int n2 = j>=0?num2.charAt(j)-'0':0;
//对当前数进行求和
int sum = n1+n2+carry;
//把结果的个位保存到reault中,十位作为进位保存下来,等待下次计算
result.append(sum%10);
carry = sum/10;
//移动指针,继续遍历下一位
i--;
j--;
}
return result.reverse().toString();
}
public static void main(String[] args) {
String num1 = "123";
String num2 = "456";
MultiplyStrings multiplyStrings = new MultiplyStrings();
System.out.println(multiplyStrings.multiply(num1,num2));
}
}