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会有溢出可能),并且两个字符串只含数字,不含”+“、”-“这种。

代码如下:

复制代码
 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     }
复制代码

转载于:https://www.cnblogs.com/upcwanghaibo/p/8672327.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值