题目
思路
竖式运算思想,遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加。
num2 除了第一位的其他位与 num1 运算的结果需要补0,计算字符串数字累加其实就是字符串相加。
代码
import java.util.Scanner;
public class Main {
public static String add(String aboveStr, String bbelowStr) {
int aIndex = aboveStr.length();
int bIndex = bbelowStr.length();
char[] aChars = aboveStr.toCharArray(); //转储为字符数组
char[] bChars = bbelowStr.toCharArray(); //转储为字符数组
int carryBit = 0; //进位
StringBuilder sb = new StringBuilder(""); //用于存储结果
while (aIndex > 0 || bIndex > 0) {
aIndex--;
bIndex--;
//相加时位数不够,用0补齐
int aNum = 0;
if (aIndex >= 0) {
aNum = aChars[aIndex] - '0'; //获取当前位的数
}
//相加时位数不够,用0补齐
int bNum = 0;
if (bIndex >= 0) {
bNum = bChars[bIndex] - '0'; //获取当前位的数
}
sb.append(((aNum + bNum + carryBit) % 10)); //获取个位上的数,如19取9
carryBit = (aNum + bNum + carryBit) / 10; //获取十位上的数,如19取1
}
//如果还需要进位则补上
if (carryBit != 0) {
sb.append(carryBit);
}
//此时结果是倒着的,倒过来即可
return sb.reverse().toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str_1, str_2;
char[] aChars, bChars;
str_2 = scanner.next(); //输入第一个数
str_1 = scanner.next(); //输入第二个数
aChars = str_1.toCharArray();
bChars = str_2.toCharArray();
//判断输入的两个数是否是数字
if (aChars[0] == '0' || bChars[0] == '0') {
return;
}
String sum = "0"; //用于存储结果
//iIndex用于补位,补后边的0
for (int i = aChars.length - 1, iIndex = 0; i >= 0; i--, iIndex++) {
int aNum = aChars[i] - '0'; //获取第一个数的某一位
StringBuilder tempSum = new StringBuilder(""); //用于存储第二个数的某一位乘以第一个数的结果
int carryBit = 0; //进位
for (int j = bChars.length - 1; j >= 0; j--) {
int bNum = bChars[j] - '0'; //获取第二个数的某一位
tempSum.append((aNum * bNum + carryBit) % 10); //获取个位上的数,如19取9
carryBit = (aNum * bNum + carryBit) / 10; //获取十位上的数,如19取1
}
if (carryBit != 0) {
tempSum.append(carryBit);
}
//此时结果是倒着的,倒过来即可
tempSum.reverse();
//如果还需要进位则补上
for (int j = 0; j < iIndex; j++) {
tempSum.append('0');
}
//结果相加:如987*456 6*987+50*987+400*987
sum = add(sum, tempSum.toString());
}
System.out.println("sum=" + sum);
}
}