Java 大數相乘、大數相加、大數相減


思路來源:: https://blog.csdn.net/lichong_87/article/details/6860329

/**
 * @date 2018/6/22
 * @description
 */
public class BigNumUtil {


    /**
     * 大數相乘
     * @param a
     * @param b
     * @return
     */
    public static String multi(String a,String b){

        //1.判斷相乘之后的符號
        char signA = a.charAt(0);
        char signB = b.charAt(0);
        boolean isPositive = true;
        if(signA == '+' || signA == '-'){
            if(signA == '+'){
                isPositive = true;
            }else{
                isPositive = false;
            }
            a = a.substring(1);
        }

        if(signB == '+' || signB == '-'){
            if(signB == '+' && isPositive){
                isPositive = true;
            }else if(signB == '-' && !isPositive){
                isPositive = true;
            }else{
                isPositive = false;
            }
            b = b.substring(1);
        }

        //2.反轉數字,使用倒序
        StringBuilder sb = new StringBuilder(a);
        char[] numA = sb.reverse().toString().toCharArray();
        sb = new StringBuilder(b);
        char[] numB = sb.reverse().toString().toCharArray();

        //3.乘法規律:
        // 對 a * b 而言,a 的第 i 位和 b 的第 j 位相乘的結果會放在 result[i+j]中
        // 兩個數(a,b)相乘最后的結果位數一定小於或等於 a.len + b.len ;
        int[] result = new int[numA.length + numB.length];
        for(int i = 0 ; i < numA.length ; i++){
            for(int j = 0 ; j < numB.length ; j++){
                result[i+j] += (numA[i] - '0') * (numB[j] - '0');
            }
        }

        //4.實現進位運算
        for(int i = 0 ; i < result.length ; i++){
            if(result[i] > 10){
                result[i+1] += result[i] / 10;
                result[i] = result[i] % 10 ;
            }
        }

        //5.輸出結果
        StringBuilder re = isPositive ? new StringBuilder() : new StringBuilder("-");
        boolean bool = true;
        for(int i = result.length-1 ; i >=0  ; i--){
            if(result[i] == 0 && bool){
                continue;
            }else{
                bool = false;
            }
            re.append(result[i]);
        }

        return re.toString();
    }


    /**
     * 大數相減
     */
    public static String sub(String a ,String b){

        char[] numA = new StringBuilder(a).reverse().toString().toCharArray();
        char[] numB = new StringBuilder(b).reverse().toString().toCharArray();

        //2.判斷符號位
        boolean isPositive = true;
        if(numA.length < numB.length){
            isPositive = false;
        }else if(numA.length == numB.length){
            int i = numA.length - 1 ;
            while (i > 0 && numA[i] == numB[i]){
                i--;
            }
            if(numA[i] < numB[i]){
                isPositive = false;
            }
        }

        //3.開始計算
        int maxLen = numA.length > numB.length ? numA.length : numB.length;
        int result[] = new int[maxLen];
        for(int i = 0 ; i < maxLen ; i++){
            int intA = i < numA.length ?(numA[i] - '0') : 0;
            int intB = i < numB.length ?(numB[i] - '0') : 0;
            if(isPositive){
                result[i] = intA - intB;
            }else{
                result[i] = intB - intA;
            }
        }

        //4.進位裝換
        for(int i = 0 ; i < result.length ; i++){
            if(result[i] < 0){
                result[i+1] -=1;
                result[i] += 10;
            }
        }

        //5.輸出結果
        StringBuilder re = isPositive ? new StringBuilder() : new StringBuilder("-");
        boolean bool = true;
        for(int i = result.length - 1 ; i >= 0 ; i--){
            if(result[i] == 0 && bool){
                continue;
            }else{
                bool = false;
            }
            re.append(result[i]);
        }


        return re.toString();
    }

    /**
     * 大數相加
     * @param a
     * @param b
     * @return
     */
    public static String add(String a,String b){

        //1.判斷相加之后的符號
        char signA = a.charAt(0);
        char signB = b.charAt(0);

        if(signA == '-' && signB == '-'){//A B 都是負的
            return "-" + add(a.substring(1),b.substring(1));
        }else if((signA == '-' && signB != '-')){//A 是負的 B是正的
            return sub(b.substring(1),a.substring(1));
        }else if(signA != '-' && signB == '-'){//A是正的 B是負的
            return sub(a.substring(1),b.substring(1));
        }

        if(signA == '-' || signA == '+'){
            a = a.substring(1);
        }
        if(signB == '-' || signB == '+'){
            b = b.substring(1);
        }

        char[] numA = new StringBuilder(a).reverse().toString().toCharArray();
        char[] numB = new StringBuilder(b).reverse().toString().toCharArray();

        //2.開始計算
        int[] result = new int[numA.length + 1];
        for(int i = 0 ; i < result.length;i++){
            int intA = i < numA.length ? numA[i] - '0' : 0;
            int intB = i < numB.length ? numB[i] - '0' : 0;
            result[i] = intA + intB;
        }
        //3.進位轉換
        for(int i = 0 ; i < result.length ; i++){
            if(result[i] > 10){
                result[i+1] += result[i] /10;
                result[i] = result[i] % 10 ;
            }
        }
        //4.輸出結果
        StringBuilder re = new StringBuilder();
        boolean bool = true;
        for(int i = result.length -1 ; i >=0  ; i--){
            if(result[i] == 0 && bool){
                continue;
            }else{
                bool = false;
            }
            re.append(result[i]);
        }
        return re.toString();
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM