zoukankan      html  css  js  c++  java
  • 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;
    
        }
    

      

  • 相关阅读:
    FileReader读数据
    FileWriter写数据
    装饰者设计模式
    数据库连接池
    事务
    EL表达式
    console.log是异步的吗?
    使用i3wm时出现的若干问题的解决办法
    使用xmodmap修改键盘映射
    CentOS7 Minimal 安装后出现的若干问题解决办法
  • 原文地址:https://www.cnblogs.com/zqiguoshang/p/6881508.html
Copyright © 2011-2022 走看看