两个大数字相加(正数)-笔试

思路

将两个数字从小数点处分开
前段和后段分别相加
处理小数点处的进位操作
相加之后,和小数点拼接返回
细节都在代码中注释

代码实现

import java.util.Scanner;

public class Adder {
    /**
     * 两个大正数相加
     * @param num1
     * @param num2
     * @return
     */
    private static String add(String num1, String num2) {
        //将两个字符串拆分成前后两端
        //前半段和前半段相加...
        int dot1=num1.length();
        for (int i=0;i<num1.length();i++){
            if(num1.charAt(i)=='.'){
               dot1=i;
            }
        }
        String before1=num1.substring(0,dot1);
        String half1="";
        if(dot1!=num1.length()){
            half1=num1.substring(dot1+1);
        }

        int dot2=num2.length();
        for (int i=0;i<num2.length();i++){
            if(num2.charAt(i)=='.'){
                dot2=i;
            }
        }
        String before2=num2.substring(0,dot2);
        String half2="";
        if(dot2!=num2.length()){
            half2=num2.substring(dot2+1);
        }
        //小数点之后相加
        String s2=addHalf(half1,half2);
        //小数点之后相加
        String s1=addPart(before1,before2);

        //小数点处的进位操作
        if(s2.length()>Math.max(half1.length(),half2.length())&&
        s2.charAt(0)=='1'){
            s2=s2.substring(1);
            char c=(char)(s1.charAt(s1.length()-1)+1);
            s1=s1.substring(0,s1.length()-1);
            s1=s1+c;
        }else if(s2.length()>Math.max(half1.length(),half2.length())&&
                s2.charAt(0)=='0'){
            s2=s2.substring(1);
        }


        //对结果做一个去0操作并返回
        return trimZ(s1+"."+s2);
    }

    /**
     * 相加操作
     * @param num1
     * @param num2
     * @return
     */
    public static String addPart(String num1,String num2){
        if(num1.length()==0||num2.length()==0){
            return num1.length()==0?num2:num1;
        }
        char[] a1=num1.toCharArray();
        char[] a2=num2.toCharArray();
        int[] all=new int[Math.max(a1.length,a2.length)+1];
        int jin=0;//进位
        int i=a1.length-1;
        int j=a2.length-1;
        int k=all.length-1;
        while (i>=0||j>=0){
            if(j>=0&&i>=0){
                int add=a1[i--]-'0'+a2[j--]-'0'+jin;
                jin=0;
                if(add>=10){
                    jin=1;
                    all[k--]=add%10;
                }else {
                    all[k--]=add;
                }
            }else if(j>=0){
                int add=a2[j--]-'0'+jin;
                jin=0;
                if(add>=10){
                    jin=1;
                    all[k--]=(add%10);
                }else {
                    all[k--]=add;
                }
            }else {
                int add=a1[i--]-'0'+jin;
                jin=0;
                if(add>=10){
                    jin=1;
                    all[k--]=add%10;
                }else {
                    all[k--]=add;
                }
            }
        }
        if(jin==1){
            all[0]=1;
        }else {
            all[0]=0;
        }
        StringBuffer sb=new StringBuffer();
        for (int a=0;a<all.length;a++){
            sb.append(all[a]);
        }
        return sb.toString();
    }

    /**
     * 后半段相加操作
     * @param num1
     * @param num2
     * @return
     */
    public static String addHalf(String num1,String num2){
        if(num1.length()==num2.length()){
            return addPart(num1,num2);
        }
        if(num1.length()==0||num2.length()==0){
            return num1.length()==0?num2:num1;
        }
        String min=num1;
        String max=num1;
        if(num1.length()>=num2.length()){
            min=num2;
        }
        if(num1.length()<=num2.length()){
            max=num2;
        }

        for(int i=min.length()-1;i<max.length()-1;i++){
            min=min+"0";
        }

        return addPart(min,max);
    }

    /**
     * 去掉多余的0
     * @param str
     * @return
     */
    public static String trimZ(String str){
        if(str==null||str.length()<1){
            return "";
        }
        int i=0;
        int j=str.length()-1;
        //从左向右去0
        while (i<str.length()&&str.charAt(i)=='0'){
            i++;
        }
        //从右向左去0
        while (j>=0&&str.charAt(j)=='0'){
            j--;
        }
        if(str.charAt(i)=='.'){
            i--;
        }
        if(str.charAt(j)=='.'){
            j--;
        }
        //只去右边的0
        return str.substring(i,j+1);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String num1 = sc.nextLine();
        String num2 = sc.nextLine();

        String sum = add(num1, num2);
        System.out.println(sum);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值