算法笔记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).

发布了28 篇原创文章 · 获赞 9 · 访问量 2430

猜你喜欢

转载自blog.csdn.net/qq_23594799/article/details/102557263