大数加法

大数加法

http://www.nowcoder.com/questionTerminal/11ae12e8c6fe48f883cad618c2e81475

0 总结

考察数组,没有什么好的办法,存粹就是暴力的解法,但是前提是要逆序一下,这样就好了很多,不逆序的话可以在短的前面补0也是一样的。但是硬用字符数组的话要判断谁先结束的问题,于是可以巧妙地转化成整型数组,整型数组默认值是0,0加上任何数不产生什么其他特殊意义,所以我们就不用判断谁先结束谁后结束了。至于要不要多+1,整上了也行,不弄的话要在最后一位判断,反正就算是最后一位相加有进位,那个进位肯定是1.

1 自己写的一版(通过)

public String solve(String s,String t){
    String str1=s;
    String str2=t;
    int len=str2.length();
    if(str1.length()>str2.length()){
        len=str1.length();
    }
    char [] a1=new StringBuffer(str1).reverse().toString().toCharArray();
    char [] a2=new StringBuffer(str2).reverse().toString().toCharArray();
    char [] res=new char[len];
    char [] tmp=null;
    int mode=0;
    for(int i=0;i<len;i++){
        if(i<a1.length && i<a2.length){
            tmp=plus(a1[i],a2[i],mode);
        }else if(i>a2.length-1 && i<a1.length){
            tmp=plus(a1[i],mode);
        }else if(i>a1.length-1 && i<a2.length){
            tmp=plus(a2[i],mode);
        }
        mode=isHasCarry(res,tmp,i);
    }
    StringBuffer resSb=new StringBuffer(String.valueOf(res));
    if(mode==1){
        resSb.append("1");
    }
    return resSb.reverse().toString();
}

public int isHasCarry(char [] res ,char [] tmp,int index){
    int mode=0;
    if(tmp.length>1){
        mode=1;
        res[index]=tmp[1];
    }else{
        res[index]=tmp[0];
    }
    return mode ;
}

public char[] plus(char a,char b,int mode ){
    int numa=a-'0';
    int numb=b-'0';
    int res=numa+numb;
    if(mode!=0){
        res+=1;
    }
    return new StringBuffer().append(res).toString().toCharArray();
}
public char[] plus(char a ,int mode){
    int numa=a-'0';
    int res=numa;
    if(mode==1){
        res+=1;
    }
    return new StringBuffer().append(res).toString().toCharArray();
}

2 漫画算法的思路改版(未测试)


public String solve(String s,String t ){
    int maxLength=s.length()>t.length()?s.length():t.length();
    int [] arrt=new int [maxLength+1];
    int [] arrs=new int [maxLength+1];
    int [] carry=new int[maxLength+1];
    int [] res=new int[maxLength+1];
    for(int i=s.length()-1;i>=0;i--){
        arrs[s.length()-1-i]=s.charAt(i)-'0';
    }
    for(int i=t.length()-1;i>=0;i--){
        arrt[t.length()-1-i]=t.charAt(i)-'0';
    }
    carry[0]=0;
    for(int i=0;i<maxLength+1;i++){
        int tmp=arrs[i]+arrt[i]+carry[i-1];
        if(tmp>=10){
            res[i]=tmp-10;
            carry[i]=1;
        }else{
            res[i]=tmp;
            carry[i]=0;
        }
    }
    StringBuffer sb=new StringBuffer();
    for(int i=maxLength;i>=0;i++){
        if(res[i]==0){
            continue;
        }else{
            sb.append(res[i]+"");
        }
    }
    return sb.toString();
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务