题目:
输入两个字符串,输出一个字符串,输入的字符串都是整数类型,位数很大,把这两个字符串相乘的结果输出,即大数相乘的算法,不允许使用系统函数,只使用基本的循环与加减乘除即可,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