题目:
输入两个字符串,输出一个字符串,输入的字符串都是整数类型,位数很大,把这两个字符串相乘的结果输出,即大数相乘的算法,不允许使用系统函数,只使用基本的循环与加减乘除即可,40分钟
例如样本“123456789111111”*“987654321111111
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//String str1 = br.readLine();
//String str2 = br.readLine();
Scanner scanner = new Scanner(System.in);
String str1 = scanner.next();
String str2 = scanner.next();
if(str1.length() == 0 || str2.length() == 0)
return;
boolean isSmallerThanZero = false;//结果是否为负数;
if((str1.charAt(0) == '-') ^ (str2.charAt(0) == '-')){
isSmallerThanZero = true;
}
//去掉符号
str1 = str1.charAt(0) == '-' ? str1.substring(1) : str1;
str2 = str2.charAt(0) == '-' ? str2.substring(1) : str2;
String ans;
if(str1.length() > str2.length()){
ans = num1Xnum2(str1, str2);
} else {
ans = num1Xnum2(str2, str1);
}
if(isSmallerThanZero)
System.out.println("-" + ans);
else
System.out.println(ans);
}
// 13
// x 14
// ------
// 52
// 130
// ------
// 182
public static String num1Xnum2(String num1, String num2) {//大、小
int len1 = num1.length();
int len2 = num2.length();
int p = 1;//num2数字下标
int q = 1;//num1数字下标
List<List<Integer>> addList = new ArrayList<>();//num1和num2每一位相乘的结果
while(len2 - p >= 0) {
int add = 0;
List<Integer> addListNum = new ArrayList<>();
addList.add(addListNum);
for(int i = 0; i < p - 1; i ++)
addListNum.add(0);//补上0对齐
q = 1;//重置
while(len1 - q >= 0) {
//获取位置上的数字
int n1 = Integer.valueOf(""+num1.charAt(len1 - q));
int n2 = Integer.valueOf(""+num2.charAt(len2 - p));
int thiz = ((n1 * n2) + add) % 10;//当前位的乘积
add = (n1 * n2 + add) / 10;//下一位的进位
addListNum.add(thiz);
q++;
}
if(add != 0) {//如果按位相乘后进位不为0,那么还要继续增加位数
while(add != 0) {
addListNum.add(add % 10);
add = add / 10;
}
}
p++;
}//这个循环结束后,就能获得一个待相加数字的列表
List<Integer> ans = addList.get(0);
for(int i = 1; i < len2; i++) {
ans = Num1AddNum2(ans, addList.get(i));
}
//然后将这个ans列表转为数字字符串
Collections.reverse(ans);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < ans.size(); i ++) {
sb.append("" + ans.get(i));
}
return sb.toString();
}
//将两个用List表示的逆序数字相加
public static List<Integer> Num1AddNum2(List<Integer> num1, List<Integer> num2) {
int p = 0, n;
int add = 0, tmp;//进位
List<Integer> ans = new ArrayList<>();//结果列表(也是逆序)
while (p < num1.size() || p < num2.size()) {
if(p >= num1.size()) {
tmp = num2.get(p) + add;
n = tmp % 10;//当前位结果
add = tmp / 10;//进位
ans.add(n);
} else if(p >= num2.size()) {
tmp = num1.get(p) + add;
n = tmp % 10;//当前位结果
add = tmp / 10;//进位
ans.add(n);
} else {
tmp = num1.get(p) + num2.get(p) + add;
n = tmp % 10;//当前位结果
add = tmp / 10;//进位
ans.add(n);
}
p++;
}
if(add != 0) {//如果按位相乘后进位不为0,那么还要继续增加位数
while(add != 0) {
ans.add(add % 10);
add = add / 10;
}
}
return ans;
}
}运行结果:
13*14 = 182
123*45 = 5535

京公网安备 11010502036488号