美文网首页
笔试题2:大数相加

笔试题2:大数相加

作者: 繁星追逐 | 来源:发表于2019-08-25 22:30 被阅读0次
package jzOffer.practice;

import java.math.BigInteger;

public class BigShuAddAndMulti {
    public static String bigNumberAdd(String f, String s) {
        // 翻转两个字符串,并转换成数组
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        // 计算两个长字符串中的较长字符串的长度
        int len = lenA > lenB ? lenA : lenB;
        int[] result = new int[len + 1];
        for (int i = 0; i < len + 1; i++) {
            // 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
            int aint = i < lenA ? (a[i] - '0') : 0;
            int bint = i < lenB ? (b[i] - '0') : 0;
            result[i] = aint + bint;
        }
        // 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
        for (int i = 0; i < result.length; i++) {
            if (result[i] > 10) {
                result[i + 1] += 1;
                result[i] %= 10;
            }
        }
        StringBuffer sb = new StringBuffer();
        // 该字段用于标识是否有前置0,如果有就不要存储
        boolean flag = true;
        for (int i = len; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        return sb.toString();
    }

    public static String bigNumberSimpleMulti(String f, String s) {
        // 获取首字符,判断是否是符号位
        char signA = f.charAt(0);
        char signB = s.charAt(0);
        char sign = '+';
        if (signA == '+' || signA == '-') {
            sign = signA;
            f = f.substring(1);
        }
        if (signB == '+' || signB == '-') {
            if (sign == signB) {
                sign = '+';
            } else {
                sign = '-';
            }
            s = s.substring(1);
        }
        // 将大数翻转并转换成字符数组
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        // 计算最终的最大长度
        int len = lenA + lenB;
        int[] result = new int[len];
        // 计算结果集合
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                result[i + j] += (int) (a[i] - '0') * (int) (b[j] - '0');
            }
        }
        // 处理结果集合,如果是大于10的就向前一位进位,本身进行除10取余
        for (int i = 0; i < result.length; i++) {
            if (result[i] > 10) {
                result[i + 1] += result[i] / 10;
                result[i] %= 10;
            }
        }
        StringBuffer sb = new StringBuffer();
        // 该字段用于标识是否有前置0,如果是0就不需要打印或者存储下来
        boolean flag = true;
        for (int i = len - 1; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        if (!sb.toString().equals("")) {
            if (sign == '-') {
                sb.insert(0, sign);
            }
        } else {
            sb.append(0);
        }
        // 返回最终结果
        return sb.toString();
    }


    public static void main(String[] args) {
        String n1 = "469552298526666";
        String n2 = "97666223339696969";
        String n = bigNumberAdd(n1, n2);
        System.out.println(n);

        // 用BigInteger类验证
        BigInteger b1 = new BigInteger(n1);
        BigInteger b2 = new BigInteger(n2);
        System.out.println(b1.add(b2));

        String n3 = "469552298526666";
        String n4 = "97666223339696969";
        String n5 = bigNumberSimpleMulti(n3, n4);
        System.out.println(n5);

        // 用BigInteger类验证
        BigInteger b3 = new BigInteger(n1);
        BigInteger b4 = new BigInteger(n2);
        System.out.println(b3.multiply(b4));
    }
    //另一种写法
    public static String add(String str1, String str2) {
        if(str1 == null)
            return str2;
        if(str2 == null)
            return str1;
        StringBuffer s1 = new StringBuffer(str1).reverse();
        StringBuffer s2 = new StringBuffer(str2).reverse();
        StringBuffer res = new StringBuffer();
        int len1 = s1.length();
        int len2 = s2.length();
        int len;
        if(len1 < len2) {
            len = len2;
            int count = len2 - len1;
            while(count-- > 0)
                s1.append('0');
        } else {
            len = len1;
            int count = len1 - len2;
            while(count-- > 0)
                s2.append('0');
        }
        int overflow = 0;
        int num;
        for(int i = 0; i < len; i++) {
            num = s1.charAt(i) - '0' + s2.charAt(i) - '0' + overflow;
            if(num >= 10) {
                overflow = 1;
                num -= 10;
            } else {
                overflow = 0;
            }
            res.append(String.valueOf(num));
        }
        if(overflow == 1)
            res.append(1);

        return res.reverse().toString();
    }

    //考虑正负
    /**
     * 求超大整数的和
     * @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();
        }
    }
}

相关文章

网友评论

      本文标题:笔试题2:大数相加

      本文链接:https://www.haomeiwen.com/subject/potlectx.html