7-11 jmu-Java-02基本语法-07-大整数相加

有若干大整数,需要对其进行求和操作。

输入格式

每行输入一个字符串代表一个大整数,连续输入若干行,当某行字符为eE时退出。

输入样例:

42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
e

输出样例:

97967883730498271109594004638709798272918548148116

代码展示

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.nextLine();
            if (str.equals("e") || str.equals("E")) {
                //System.out.println("我在if里");
                break;
            } else {
                //System.out.println("我在else里");
                list.add(str);
            }
        }
        //System.out.println("接收完成");

        ArrayList<String> temp = new ArrayList<>();
        temp.add(sumTwo(list.get(0), list.get(1)));
        for (int i = 2, j = 0; i < list.size(); i++, j++) {
            //System.out.println("我其实不该进循环");
            temp.add(sumTwo(list.get(i), temp.get(j)));
        }

        String res = temp.get(temp.size() - 1);
        System.out.println(res);


        //检查错误
        /*
        String ptaAns = "97967883730498271109594004638709798272918548148116";
        System.out.println(ptaAns);

        if (ptaAns.length() != res.length()) {
            System.out.println("长度不一样啊");
            System.out.println("pta len = " + ptaAns.length());
            System.out.println("my len = " + res.length());
        }
        for (int i = 0; i < ptaAns.length(); i++) {
            if (ptaAns.charAt(i) != res.charAt(i)) {
                System.out.print("#");
            } else {
                System.out.print(ptaAns.charAt(i));
            }
        }
*/
    }

    public static String sumTwo(String s1, String s2) {
        StringBuilder result = new StringBuilder();

        /*StringBuilder zero = new StringBuilder();
        for (int i = 0; i < 30; i++) {
            zero.append(0);
        }
        String zeroStr = zero.toString();*/

        String zeroStr = "00000000000000000000000000000000000000000000";

        int len1 = s1.length();
        int len2 = s2.length();
        //较小数前段补0对齐
        if (len1 > len2) {
            s2 = zeroStr.substring(0, len1 - len2) + s2;
        } else {
            s1 = zeroStr.substring(0, len2 - len1) + s1;

        }

        //两数相加,从低位逐个运算进位
        int carry = 0;
        for (int i = s1.length() - 1; i >= 0; i--) {
            //System.out.println("当前i为: " + (s1.length()-i));

            int temp = (s1.charAt(i) - '0') + (s2.charAt(i) - '0');
            //System.out.println("temp = " + (s1.charAt(i) - '0') + " + "+ (s2.charAt(i) - '0') + " = " + temp);

            result.append((temp + carry) % 10);
            //System.out.println("result now is " + result.toString());

            carry = (temp + carry) / 10;
            //System.out.println("carry: " + carry);
            //System.out.println();
        }
        if (carry > 0) result.append(carry);//不过此时结果是逆序

        //倒转一下
        String resStr = result.toString();
        StringBuilder ans = new StringBuilder();
        for (int i = resStr.length() - 1; i >= 0; i--) {
            ans.append(resStr.charAt(i));
        }

        return ans.toString();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值