码迷,mamicode.com
首页 > 编程语言 > 详细

不使用BigInteger类实现大数相加(Java)

时间:2018-04-07 12:49:09      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:over   取消   反转字符串   gpo   AC   int   void   res   out   

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)

标签:over   取消   反转字符串   gpo   AC   int   void   res   out   

原文地址:https://www.cnblogs.com/xuyiqing/p/8732688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!