拼多多校招编程题--大整数相乘(Java实现)

题目描述

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

思路:

(1)参考乘法计算,随机取一个乘数1,并从后向前遍历i

(2)用另外一个乘数2,并从后向前遍历j,用i乘j,遍历到j的十位时,记得在末位加一个0,百位加2个,千位加3个,依次下去。

(3)每遍历一个字符,得到一个结果并放入数组

(4)取这个数组最后一个字符串就是最长的字符串,以其长度为基准,向数组中其他元素前面添加一定数量的‘0’,保证所有元素的长度相等

(5)然后,遍历该数组,从后向前遍历字符串,每个纵列相加,结果对10分别取整和取余数,整进1位即在下次计算纵列相加时加上这个数,余则赋值当前索引位置字符

(6)如果遍历完成后,进位仍然大于0,就在字符串前面加上这个进位字符,此时针对(乘数1)乘(乘数2)个位已经算完成

(7)后面就是遍历所有乘数1了,方法和前面一样

(8)注意,到最后,得到(乘数2)乘(乘数1)乘所有字符的数组,该数组长度是乘数1字符的长度,在初始化时需要注意,当然也可以使用ArrayList。

以上思路,是我个人的,仅供参考,代码如下:

import java.util.Scanner;

public class Main {
//        前面少的补'0'
    static String[] addZero(String[] s) {
        int lastCharLength = s[s.length - 1].length();
        for (int i = 0; i < s.length - 1; i++) {
            StringBuilder temp1 = new StringBuilder();
            for (int j = 0; j < lastCharLength - s[i].length(); j++) {
                temp1.append('0');//位数大的后面补0
            }
            s[i] = temp1.toString() + s[i];
        }
        return s;
    }

    static String[] cal2(String s1, char c1, int eLength) {
        int index = s1.length() - 1, e = 0;
        char[] c = s1.toCharArray();
        String[] s = new String[c.length];
        while (index > -1) {
            int temp = Integer.parseInt(String.valueOf(c1)) * Integer.parseInt(String.valueOf(c[index]));
            StringBuilder temp1 = new StringBuilder(String.valueOf(temp));
            for (int i = 0; i < e + eLength; i++) {
                temp1.append('0');//位数大的后面补0
            }
            s[e] = temp1.toString();
            index -= 1;
            e += 1;
        }
        //        前面少的补'0'
        return addZero(s);
    }

    static String add(String[] s1) {
        int index = s1[0].length() - 1;
        char[] chars = new char[s1[0].length()];
        int pretemp = 0;
        while (index > -1) {
            int persum = 0;
            for (int i = 0; i < s1.length; i++) {
                persum += Integer.parseInt(String.valueOf(s1[i].charAt(index)));
            }
            persum += pretemp;
            pretemp = persum / 10;
            chars[index] = String.valueOf(persum % 10).charAt(0);
            index -= 1;
        }
        if (pretemp > 0) return String.valueOf(pretemp) + String.valueOf(chars);
        else return String.valueOf(chars);
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String line = input.nextLine();
        String[] lines = line.split(" ");
        String partLine1 = lines[0], partLine2 = lines[1];
        int eLength = 0;
        String[] strings = new String[partLine2.length()];
        for (int i = partLine2.length() - 1; i >= 0; i--) {
            String[] s = cal2(partLine1, partLine2.charAt(i), eLength);
            strings[eLength] = add(s);
            eLength += 1;
        }
        System.out.println(add(addZero(strings)));
    }
}

运行结果:

顺便吐槽一下,这个在线编辑器太难用了,还是本地的好用,要是考试就gg了。

猜你喜欢

转载自blog.csdn.net/weixin_42363997/article/details/87976916
今日推荐