IT 面试题

一个同学在华为面试题目: 写一个大字符串数相加算法。
解决办法:
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.把复杂问题划分为许多小问题一个一个解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值