1. 程式人生 > >不使用BigInteger類實現大數相加(Java)

不使用BigInteger類實現大數相加(Java)

port 串操作 一次 緩存 als 驗證 gin pos nbsp

package add;

import java.math.BigInteger;

public class BigAdd {
    public static String bigadd(String n1, String n2) {
        // 字符串緩存區:提高字符串操作效率
        StringBuffer result = new StringBuffer();
        // 反轉字符串
        n1 = reverse(n1);
        n2 = reverse(n2);
        // 最大長度
        int len1 = n1.length();
        
int len2 = n2.length(); // 最大長度 int maxLen = max(len1, len2); // 是否需要進位 boolean over = false; // 短字符串的高位用0補齊 cover(n1, n2, len1, len2); for (int i = 0; i < maxLen; i++) { // 每一位相加 int nSum = changeToint(n1, i) + changeToint(n2, i);
if (nSum < 9) { // 上一次有進位 if (over = true) { if (nSum == 9) { result.append(0); } else { result.append(nSum + 1); // 取消進位 over = false
; } } else { result.append(nSum); } } else { if (over == true) { result.append(nSum - 10 + 1); } else { result.append(nSum - 10); over = true; } } } // 最後是否還有進位 if (over == true) { result.append(1); } return result.reverse().toString(); } public static String reverse(String n) { n = new StringBuffer(n).reverse().toString(); return n; } public static int max(int a, int b) { return a > b ? a : b; } public static int changeToint(String n, int i) { // 加""將字符轉為String return Integer.parseInt(n.charAt(i) + ""); } public static void cover(String n1, String n2, int len1, int len2) { if (len1 < len2) { for (int i = len1; i < len2; i++) { n1 += "0"; } } else if (len1 > len2) { for (int i = len2; i < len1; i++) { n2 += "0"; } } } // 測試 public static void main(String[] args) { String n1 = "666666666666666666"; String n2 = "696969696969696969"; String n = bigadd(n1, n2); System.out.println(n); // 用BigInteger類驗證 BigInteger b1 = new BigInteger(n1); BigInteger b2 = new BigInteger(n2); System.out.println(b1.add(b2)); } }

不使用BigInteger類實現大數相加(Java)