大数加法
大数加法
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();
}
