若是帶‘+’,‘-’ 操做符編程
/** * 求超大整數的和 * @param num1 * @param num2 * @return
*/
public static String bigNumberSumBetter(String num1, String num2) { char sign = '+'; char sign1 = num1.charAt(0); char sign2 = num2.charAt(0); String number1 = ""; String number2 = ""; // 去符號位操做
if (sign1 == '-' || sign1 == '+') { number1 = num1.substring(1); } else { sign1 = '+'; number1 = num1; } // 去符號位操做
if (sign2 == '-' || sign2 == '+') { number2 = num2.substring(1); } else { sign2 = '+'; number2 = num2; } boolean isDig1 = number1.matches("[1-9][0-9]*"); boolean isDig2 = number2.matches("[1-9][0-9]*"); if (!isDig1 || !isDig2) { throw new NumberFormatException("輸入的數據不是正確的格式的整數"); } //兩個數的長度
int length1 = number1.length(); int length2 = number2.length(); int len = length1>=length2? length1+1:length2+1; StringBuffer number1Buffer = new StringBuffer(); StringBuffer number2Buffer = new StringBuffer(); //擴展數據的長度,使它們的長度同樣
if(length1>length2){ for(int i=0; i<length1-length2; i++){ number2Buffer.append("0"); } }else if(length1<length2){ for(int i=0; i<length2-length1; i++){ number1Buffer.append("0"); } } number1Buffer.append(number1); number2Buffer.append(number2); char[] chars1 = number1Buffer.reverse().toString().toCharArray(); char[] chars2 = number2Buffer.reverse().toString().toCharArray(); //存儲每位相加的結果
int[] result = new int[len]; //同號相加
if(sign1==sign2){ sign = sign1; for(int i=0; i<len-1; i++){ result[i] = (chars1[i]-'0')+(chars2[i]-'0'); } // 處理進位
for (int i = 0; i < len; i++) { if (result[i] >= 10) { result[i + 1] += result[i] / 10; result[i] = result[i] % 10; } } }else { // 拿大的數減去小的數
boolean lager = number1.compareTo(number2)>0 ? true : false; if (lager) { sign = sign1; for (int i = 0; i < len-1; i++) { result[i] = (chars1[i] - '0') - (chars2[i] - '0'); } } else { sign = sign2; for (int i = 0; i < len-1; i++) { result[i] = (chars2[i] - '0') - (chars1[i] - '0'); } } // 處理借位
for (int i = 0; i < len; i++) { if (result[i] < 0) { result[i] += 10; result[i + 1]--; } } } // 結果沒有進位時的0處理
boolean flag = true; StringBuffer resultStr = new StringBuffer(); for (int i = result.length - 1; i >= 0; i--) { if (result[i] == 0 && flag) { continue; } flag = false; resultStr.append(result[i]); } // 符號處理
if (sign == '-') { return "-" + resultStr.toString(); } else { return resultStr.toString(); } }
本題是CVTE二面編程題,首先考慮返回值確定是一個字符串(int會有溢出可能),而且兩個字符串只含數字,不含」+「、」-「這種。app
代碼以下:spa
1 public static String add(String str1, String str2) {
2 if(str1 == null)
3 return str2;
4 if(str2 == null)
5 return str1;
6 StringBuffer s1 = new StringBuffer(str1).reverse();
7 StringBuffer s2 = new StringBuffer(str2).reverse();
8 StringBuffer res = new StringBuffer();
9 int len1 = s1.length();
10 int len2 = s2.length();
11 int len;
12 if(len1 < len2) {
13 len = len2;
14 int count = len2 - len1;
15 while(count-- > 0)
16 s1.append('0');
17 } else {
18 len = len1;
19 int count = len1 - len2;
20 while(count-- > 0)
21 s2.append('0');
22 }
23 int overflow = 0;
24 int num;
25 for(int i = 0; i < len; i++) {
26 num = s1.charAt(i) - '0' + s2.charAt(i) - '0' + overflow;
27 if(num >= 10) {
28 overflow = 1;
29 num -= 10;
30 } else {
31 overflow = 0;
32 }
33 res.append(String.valueOf(num));
34 }
35 if(overflow == 1)
36 res.append(1);
37
38 return res.reverse().toString();
39 }