兩個大數字相加(正數)-筆試

思路

將兩個數字從小數點處分開
前段和後段分別相加
處理小數點處的進位操作
相加之後,和小數點拼接返回
細節都在代碼中註釋

代碼實現

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章