各位在看代码时一定要结合我们的算术法则,就是小学都学过的竖式运算!实在不行你就把竖式列出来看!
看完点个关注和赞呐!
import java.util.Scanner;
/**
* @author Trank
* @projectName 字节
*/
public class 字符串相乘 {
public static void main(String[] args) {
Solution solution = new Solution();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
String num1 = scanner.next();
System.out.println("请输入第二个数:");
String num2 = scanner.next();
String multiply = solution.multiply(num1 ,num2);
System.out.println("num1 * num2 结果为: "+ multiply);
}
}
class Solution {
/**
* 计算形式
* num1
* x num2
* ------
* result
*/
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
// 保存计算结果
String res = "0";
// num2 逐位与 num1 相乘
for (int i = num2.length() - 1; i >= 0; i--) {
int carry = 0;// carry 存储我们在算数运算中,相乘后 进的那个十位数 比如 123*456 123*6 3*6=18 把这个十位的1存储到carry中
// 保存 num2 第i位数字与 num1 相乘的结果
StringBuilder temp = new StringBuilder();
// 补 0
for (int j = 0; j < num2.length() - 1 - i; j++) {
temp.append(0);
}
int n2 = num2.charAt(i) - '0';//对应字符数字-0字符 可以获取该数字,'1'-'0' 是他们ASCII码相减,刚好可以得到数字1
// num2 的第 i 位数字 n2 与 num1 相乘
/*
模拟的是我们的乘法运算,
* */
for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {
int n1 = j < 0 ? 0 : num1.charAt(j) - '0';
int product = (n1 * n2 + carry) % 10; // 仅仅把个位拿出来追加到相乘结果中
temp.append(product);
carry = (n1 * n2 + carry) / 10;//把除个位外其他位的数字拿出来存储到carry,用于下次的计算
}
// 将当前结果与新计算的结果求和作为新的结果
res = addStrings(res, temp.reverse().toString());//reverse()方法可以把字符串颠倒,因为我们在计算过程中采用的append方法,因此需要颠倒一下
}
return res;
}
/**
* 对两个字符串数字进行相加,返回字符串形式的和
*/
public String addStrings(String num1, String num2) {
StringBuilder builder = new StringBuilder();
int carry = 0;
for (int i = num1.length() - 1, j = num2.length() - 1;
i >= 0 || j >= 0 || carry != 0;
i--, j--) {
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
int sum = (x + y + carry) % 10;
builder.append(sum);
carry = (x + y + carry) / 10;
}
return builder.reverse().toString();
}
}