Java大數相加

若是帶‘+’,‘-’ 操做符編程

/** * 求超大整數的和 * @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     }
複製代碼
相關文章
相關標籤/搜索