首页 > 代码库 > java BigInteger实现

java BigInteger实现

BigInteger底层是用int[]实现的。

 

之前看数据结构,一直以为BigInteger是用链表实现的。但后来发现那只是练习时增加难度所用。

之后发现用String实现比链表不知道快了多少倍。就以为是用String实现。

可是一查,才发现原来使用int[]实现的。

是啊,用int[]就省去了字符转数字的麻烦!

 

下面给出用String实现的加和乘算法。思路和我们手算是一样的。

 public String mulOneDigit(String num1, char digit, int level){
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = num1.length()-1; i >= 0 || carry != 0;  i--){
            int tmp = i < 0 ? 0 : num1.charAt(i) - ‘0‘;
            sb.insert(0, (tmp * (digit-‘0‘) + carry) % 10);
            carry = (tmp * (digit-‘0‘) + carry) / 10;
        }
        while (level > 0){
            sb.append(0);
            level--;
        }
        return sb.toString();
    }

  /**
     * 用 ?: 来规避两段循环,并注意最高位进一的情况
     * @param num1
     * @param num2
     * @return
     */
    public String add(String num1, String num2){
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = num1.length() - 1, j = num2.length() - 1;  i >= 0 || j>=0 || carry != 0; i--, j--){
            int a = i < 0 ? 0 : num1.charAt(i) - ‘0‘;
            int b = j < 0 ? 0 : num2.charAt(j) - ‘0‘;
            sb.insert(0, (a+b+carry) % 10);
            carry = (a+b+carry)/10;
        }
        return sb.toString();
    }

  
    public String multiply(String num1, String num2) {
        String small, large;
        if (num1.length() > num2.length()){
            large = num1;
            small = num2;
        }else {
            large = num2;
            small = num1;
        }
        List<String> stringList = new ArrayList<>();
        int level = 0;
        for (int i = small.length()-1; i >= 0 ; i--) {
            stringList.add(mulOneDigit(large, small.charAt(i), level++));
        }
        String result = "0";
        for (String str : stringList){
            result = add(str, result);
        }
        if (result.charAt(0) == ‘0‘){
            result = "0";
        }
        return result;

    }

  

java BigInteger实现