一个同学在华为面试题目: 写一个大字符串数相加算法。
解决办法:
java 版:
package com;
public class StringAdd {
public static void main(String []args){
String a="123499234512345123451234512345123451234589";
String b= "5432154321543215432154321543215432198";
StringAdd strAdd=new StringAdd();
String rs=strAdd.StrAdd(a, b);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>");
StringBuffer strBuf=new StringBuffer();
for(int i=0;i<Math.abs((a.length()-b.length()));i++){
strBuf.append(" ");
}
System.out.println(a+"+\r\n"+strBuf+b+"=\r\n"+rs);
}
/*char 转为int---------运算*/
public int charToInt(char a){
return a-48;
}
/*int 转为char---------表示*/
public char intTochar(int a){
return (char)(a+48);
}
public String StrAdd(String a,String b){
char [] a1=a.toCharArray();
char [] b1=b.toCharArray();
int alen=a1.length;
int blen=b1.length;
int len=alen>blen?alen:blen; //a1,b1长度大者
int minlen=alen<blen?alen:blen; //a1,b1长度小者
char []sumChar=new char[len+1];
boolean isCarry=false; //是否有进位
int sumInt=0;
for(int i=0;i<minlen;i++){ //从低位往高位加
if(isCarry){ //上一位有进位要加上1
sumInt=this.charToInt(a1[alen-i-1])+this.charToInt(b1[blen-i-1])+1; //运算时要把char 转为int 。
}else{
sumInt=this.charToInt(a1[alen-i-1])+this.charToInt(b1[blen-i-1]);
}
if(sumInt>9){ //本位有进位 1.把 sumint-9-1 转为char 后赋给数组如12 的话要12-9-1=2 赋给该位 2.设置isCarry=true,
sumChar[sumChar.length-i-1]=this.intTochar(sumInt-9-1);
isCarry=true;
}else{
isCarry=false;
sumChar[sumChar.length-i-1]=this.intTochar(sumInt);
}
}
for(int j=0;j<len-minlen;j++){ //对剩下部分相加。
if(alen>blen){ //字符串a 长度大于字符串b 长度。把a 剩余部分与前面进位处理。
if(isCarry){
if(9==this.charToInt(a1[len-minlen-j-1])){
sumChar[len-minlen-j]='0'; //sumChar 不是 len-minlen-j 是因为 sumChar[len+1] 长度多一位
isCarry=true;
}else{
sumChar[len-minlen-j]=this.intTochar(this.charToInt(a1[len-minlen-j-1])+1);
isCarry=false;
}
}else{
sumChar[len-minlen-j]=a1[len-minlen-j-1];
isCarry=false;
}
}else{ //字符串b 长度大于字符串a 长度。把b 剩余部分与前面进位处理。
if(isCarry){
if(9==this.charToInt(b1[len-minlen-j-1])){
sumChar[len-minlen-j]='0'; //sumChar 不是 len-minlen-j 是因为 sumChar[len+1] 长度多一位
isCarry=true;
}else{
sumChar[len-minlen-j]=this.intTochar(this.charToInt(b1[len-minlen-j-1])+1);
isCarry=false;
}
}else{
sumChar[len-minlen-j]=a1[len-minlen-j-1];
isCarry=false;
}
}
}
StringBuffer strBuf=new StringBuffer();
return strBuf.append(sumChar).toString().trim();
}
}
运行结果为:
>>>>>>>>>>>>>>>>>>>>>>
123499234512345123451234512345123451234589+
5432154321543215432154321543215432198=
123504666666666666666666666666666666666787
算法不是很好需要改进,请大侠们多多指点。
1.写算法时一定要思路清晰。
刚开始没有写 intToChar 和charToInt 感觉很容易写错,所以我们写程序把容易错的部分分离出来写成一个功能明确的函数。
2.把复杂问题划分为许多小问题一个一个解决。