標籤:思路 return insert tip [] -- 使用 integer level
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; }
java BigInteger實現