Java 杭电1002 大整数求和

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

/**
 * 如果输入003
 * char[0] 是0,所以大数组相加需要数组反向遍历相加
 * @param args
 */
public static void main(String[] args) {

    Scanner in = new Scanner(new BufferedInputStream(System.in));
    while (in.hasNextLine()) {
        //记录计算到第几行
        int index = 1;
        //输入一个整数n,表明下面将会有n行,每行包含数字空格数字
        int linesNum = Integer.parseInt(in.nextLine());
        //记录一下行数
        int mirror = linesNum;
        //如果输入的数字大于0 并且 输入后面的行
        while (linesNum > 0&&in.hasNextLine()) {
            String str = in.nextLine();
            String[] ab = str.split(" ");
            //第一个数字a
            char[] a1char = ab[0].toCharArray();
            //第二个数字b
            char[] b1char = ab[1].toCharArray();
            //去掉数字 a b的前导0 例如 0009 需要处理成 9
            a1char = filter0(a1char);
            b1char = filter0(b1char);
            //记录数字a b位数
            int a1charLenth = a1char.length;
            int b1charLenth = b1char.length;
            //如果输入的两个字符串都是00000 0000 ,就直接输出0
            if (a1charLenth==0&&b1charLenth==0){
                printResult(index,mirror,ab,0+"");
                index++;
                linesNum--;
                continue;
            }
            //两个字符串长度差值
            int a1largerThanb1 = a1charLenth - b1charLenth;
            //先声明结果
            char[] resultchar = null;
            //比较数组长短,我们将短数组加到长的上面去,这样遍历一次长数组,长数组就是结果
            if (a1largerThanb1>0) {
                resultchar = sum(a1char,b1char,a1largerThanb1);
            } else {
                resultchar = sum(b1char,a1char,Math.abs(a1largerThanb1));
            }
            //转换成字符串打印
            String resultstr = new String(resultchar);
            printResult(index,mirror,ab,resultstr);
            index++;
            linesNum--;
        }
    }

}

/**
 * 打印结果
 * @param index 处理到第几行
 * @param mirror 总行数
 */
private static void printResult(int index,int mirror,String[] ab,String resultstr) {
    System.out.println("Case " + index + ":");
    System.out.println(ab[0] + " + " + ab[1] + " = " + resultstr);
    //如果当前行数已经是最后一行了,就不需要打印空行
    if (index!=mirror){
        System.out.println();
    }
}

/**
 * 求和
 * @param large 长度更长的数组
 * @param shorter 长度短的数组
 * @param cut 数组长度差值的绝对值
 * @return
 */
private static char[] sum(char[] large,char[] shorter,int cut){
    //保存当前的进位
    int forward = 0;
    //逆序遍历长度更长的数组 因为字符串转char数组之后 是从左到右排列的 9900 0099 large[0] = 9 shorter[0]=0
    for (int i = large.length-1; i >= 0; i--) {
        int sum = forward;
        //从短数组取值需要减去差值,否则就不需要取了,仅处理进位
        if ((i-cut)<0){
        }else {
            //如果短数组还有没处理完的数,取出并计算 sum = sum + b,需要将char转换成int
            int b = char2int(shorter[i-cut]);
            sum += b;
        }
        //取出对应的长数组,将char转换成int
        int a = char2int(large[i]);
        //求和
        sum += a;
        //除10取商,获得新的进位
        forward = sum / 10;
        //当前位数保存除10的余数,也就是对10进行模运算
        large[i] = int2char(sum % 10);
    }
    //此时进位如果>0 说明最左边有进位 例如,9999+1 = 10000
    if (forward>0){
        char[] result = new char[large.length+1];
        result[0] = int2char(forward);
        for (int i = 1; i < result.length; i++) {
            result[i] = large[i-1];
        }
        large = result;
    }
    return large;
}

private static int char2int(char input){
    return (int)input - (int)'0';
}

private static char int2char(int input){
    return(char)(input + '0');
}

/**
 * 去掉前导0
 * @param chars
 * @return
 */
private static char[] filter0(char[] chars){
    int num0 = 0;
    for (int i = 0; i < chars.length; i++) {
        if(char2int(chars[i])==0){
            num0++;
        }else {
            break;
        }

    }
    if (num0==0){
        return chars;
    }
    char []result0 = new char[chars.length-num0];
    for (int i = num0; i < chars.length; i++) {
        result0[i-num0] = chars[i];
    }
    return result0;
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值