算法筆記1:實現任意長數字相加

使用Java實現任意長數字相加


思路:模擬加法的進位操作,從後遍歷兩個數組,設置用於兩個當前數組位置的標誌位。爲了這樣遍歷,需要使用較長的那個字符串,作爲for循環的最大值。當兩個數字長度一致時,可能進位也可能不進位,要分情況討論。

下面是實現代碼:

 @Test
    public void bigAddTest(){
        bigAdd("9906796769679798703423235246363654754876441124214230999787689","111887023830573298752738651237");
    }


    /**
     * 一個較長的數字加一個較短的數字
     * @param s1
     * @param s2
     */
    private void bigAdd(String s1,String s2){
        if((!checkIsNumStr(s1))||(!checkIsNumStr(s2))){
            System.out.println("數字格式不正確");
            return;
        }
        String temStr=s1;
        if(s1.length()<s2.length()){//交換兩個字符串位置,讓s1爲最長的那個
            s1=s2;
            s2=temStr;
        }
        StringBuilder sb=new StringBuilder();
        int len1=s1.length()-1;
        int len2=s2.length()-1;

        int extraAdd=0;//記錄進位

        for(int i=len1;i>=-1;i--){//從後向前遍歷,遍歷到最長字符串的前一位,保證在有進位時可以進位
            int num1=0;
            if(i>-1){
                num1=s1.charAt(i)-0x30;//如果不是最後一位,則讀取索引位置的數字
            }
            int num2=0;
            if(i-(len1-len2)>=0){
                num2=s2.charAt(i-(len1-len2))-0x30;//如果不是說s2的最後一位,則讀取索引位置的數字
            }

            int tmpSum=num1+num2+extraAdd;//計算本次的和

            if(i==-1){
                if(tmpSum!=0){//如果最後有進位,那就加上
                    sb.append(tmpSum);
                }
                break;
            }
            extraAdd=tmpSum/10;//計算進位大小
            sb.append(tmpSum%10);//計算餘數,也就是本位制的數字,然後把數字append到StringBuilder()
        }

        System.out.println(sb.reverse().toString());//最後需要把數字逆序一下


    }

    /**
     * 檢查是不是數字
     * @param str
     * @return
     */
    private boolean checkIsNumStr(String str){
        if(str==null||str.length()==0){
            return false;
        }else if(str.length()>1&&str.charAt(0)=='0'){
            return false;
        }else {
            char strArray[]=str.toCharArray();
            for(char c:strArray){
                if(!((c>='0')&&(c<='9'))){
                    return false;
                }
            }
        }
        return true;
    }

算法複雜度爲O(N).

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