• Java实现大整数乘法


    1 问题描述
    计算两个大整数相乘的结果。

    2 解决方案
    2.1 蛮力法

    package com.liuzhen.chapter5;
    
    import java.math.BigInteger;
    
    public class BigNumber {
        /*
         * 参数A:进行乘法运算的大整数A,用字符串形式表示
         * 参数B:进行乘法运算的另一个大整数B,用字符串形式表示
         * 函数功能:以字符串形式返回A*B的结果
         */
        public String getMultiBigNumber(String A,String B){
            if(A.length() > B.length()){       //当B字符串长度小于A时,在B字符串前补0,使得两个字符串长度一致
                char[] temp = new char[A.length()-B.length()];
                for(int i = 0;i < A.length() - B.length();i++)
                    temp[i] = '0';
                B = String.valueOf(temp) + B;
            }
            if(A.length() < B.length()){      //当A字符串长度小于B时,在A字符串前补0,使得两字符串长度一致
                char[] temp = new char[B.length()-A.length()];
                for(int i = 0;i < B.length() - A.length();i++)
                    temp[i] = '0';
                A = String.valueOf(temp) + A;
            }
            
            int len = A.length() + B.length();
            
            char[] arrayA = A.toCharArray();
            char[] arrayB = B.toCharArray();
            for(int i = 0;i < arrayA.length;i++)     //检查字符串A中是否有非数字的字符
                if(arrayA[i] < '0' || arrayA[i] > '9')
                    return null;
            for(int i = 0;i < arrayB.length;i++)    //检查字符串B中是否有非数字的字符
                if(arrayB[i] < '0' || arrayB[i] > '9') 
                    return null;
            
            char[] result = new char[len];    //用于存放最终乘法运算结果,长度len表示A*B的最长长度
            for(int i = 0;i < len;i++)         //初始化字符数组result,各个元素均为'0'
                result[i] = '0';
            
            int countI = 0;       //用于计算当前B中已经和A中每个字符进行完乘法运算的字符个数    
            for(int i = arrayB.length-1;i >= 0;i--){
                int tempB = arrayB[i] - '0';
                int countJ = 0;   //用于计算当前A中正在进行乘法运算的字符个数
                for(int j = arrayA.length - 1;j >= 0;j--,countJ++){
                    int tempA = arrayA[j] - '0';
                    int tempRe = (tempB * tempA) % 10;  //用于计算当前位置的数
                    int tempResult = result[(len-1-countJ)-countI] - '0';  //当前位置已包含的结果
                    tempResult += tempRe;
                    //count--表示当前A字符串中进行乘法运算的字符位置,countI表示当前B字符串中进行乘法运算的字符位置
                    //(count--)-countI则表示当前进行乘法运算两个数字结果的最低位的位置
                    result[(len-1-countJ)-countI] = (char) (tempResult%10 + 48); //当前位置数最终结果
                    
                    int tempDi = tempB * tempA / 10 + tempResult / 10;       //用于计算进位
                    for(int k = 1;tempDi > 0;k++){   //处理进位操作
                         //当前下第k个位置包含的结果
                        int tempResultK = result[(len-1-countJ)-countI-k] - '0'; 
                        tempResultK += tempDi;
                        result[(len-1-countJ)-countI-k] = (char) (tempResultK%10 + 48);
                        tempDi = tempResultK / 10;
                    }
                }
                countI++;
            }
            
            return getNoneZeroString(result);
        }
        
        //去掉字符串前面的0
        public String getNoneZeroString(char[] result){
            int count = 0;
            for(int i = 0;i < result.length;i++){
                if(result[i] == '0')
                    count++;
                else
                    break;
            }
            char[] A = new char[result.length-count];
            for(int i = 0;i < result.length-count;i++)
                A[i] = result[count+i];
            return String.valueOf(A);
        }
        
        public static void main(String[] args){
            long t1 = System.currentTimeMillis();
            BigNumber test = new BigNumber();
            String A = "123456789123232342432423441345342523452534235443253254";
            String B = "987654322234242424332423414324532542354325235345435435";
            System.out.println("大整数A*B的结果:"+test.getMultiBigNumber(A, B));
            BigInteger bigInteger1 = new BigInteger("123456789123232342432423441345342523452534235443253254");
            BigInteger bigInteger2 = new BigInteger("987654322234242424332423414324532542354325235345435435");
            bigInteger2 = bigInteger2.multiply(bigInteger1);
            System.out.println("验证后A*B的结果:"+bigInteger2);
            long t2 = System.currentTimeMillis();
            System.out.println("耗时:"+(t2-t1)+" 毫秒");
        }
    }
    

    运行结果:

    大整数A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
    验证后A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
    耗时:4 毫秒
    
  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077959.html
Copyright © 2020-2023  润新知