题目:

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