1. 程式人生 > >兩個大數相乘JAVA版

兩個大數相乘JAVA版

import java.util.Scanner;

public class BigNumMul {

    public static void main(String[] args) {
        Scanner canner = new Scanner(System.in);
        String str1 = canner.nextLine();
        String str2 = canner.nextLine();
        canner.close();
        System.out.println(BigNumMul.mult(str1, str2));
    }

    /*
     * str1 因子 str2 因子
     * 
     * @result 乘積
     */
public static String mult(String str1, String str2) { String result = ""; int[] rs = BigNumMul.mul(BigNumMul.strToNum(str1), BigNumMul.strToNum(str2)); if (rs == null) { System.out.println("輸入錯誤"); } else { result = BigNumMul.changeToString(rs); } return
result; } /* * num1 因子 num1[i] 對應數字num1.length-i+1位 str2 因子 * * @result 乘積 */ public static int[] mul(int[] num1, int[] num2) { if (num1 == null || num1.length == 0 || num2 == null || num2.length == 0) return null; // 兩數乘積位數不會超過乘數位數和+ 3位
int[] rs = new int[num1.length + num2.length + 3]; for (int i = 0; i < rs.length; i++) { rs[i] = 0; } // 對齊逐位相乘 for (int i = 0; i < num2.length; i++) { if (num2[i] == 0) { continue; } for (int j = 0; j < num1.length; j++) { if (num1[j] == 0) { continue; } rs[j + i] += (num1[j] * num2[i]); } } // 進位處理 for (int m = 0; m < rs.length; m++) { int carry = rs[m] / 10; rs[m] = rs[m] % 10; if (carry > 0) rs[m + 1] += carry; } return rs; } /* * 將字串轉換成對應int陣列 */ public static int[] strToNum(String str) { if (str == null || "".equals(str)) { return null; } char[] c = str.toCharArray(); int[] num = new int[c.length]; // 高低位對調 for (int i = 0; i < c.length; i++) { int m = c.length - i - 1; if ('0' <= c[m] && c[m] <= '9') { num[i] = Integer.parseInt(String.valueOf(c[m])); System.out.println(num[i]); } else { return null; } } System.out.println(BigNumMul.changeToString(num)); return num; } /* * 將int陣列轉換成對應字串 */ public static String changeToString(int[] num) { String rs = ""; int i = 0; // 找到最高位 for (i = num.length - 1; i >= 0; i--) { if (num[i] != 0) break; } for (; i >= 0; i--) { rs += num[i]; } return rs; } }