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

思路

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

代码实现

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);
    }
}

发布了149 篇原创文章 · 获赞 137 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhang_ye_ye/article/details/99063350