记一次和同学上班无聊讨论一个面试题的做法
在这里用笨拙的方法调试出了结果,如果有不对,还望多多包涵并指出.
实现思想是使用char上升int不会有精度损失.但是这里有个小坑就是char转换int 是使用ASCII码 所以需要减去48
从最右边的个位数开始算起,所以短的字符串和长的字符串之间的差异长度,需要额外处理
不多说 上代码 直观
String s1 = "87534683132454341354654654646545641387313849681815152182318971318413864103588461310843018646103215131380432108560480";
String s2 = "456456465464645465465465465465456465464564654654564654654654546546454654654564654645646546545646546546545465464";
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
//短字符串 与 长字符串 差异长度
int subLen = c1.length - c2.length;
int inTmp = 0;//进位数
StringBuilder sb = new StringBuilder(128);//记录字符 反序,最后需要reverse反转一下
for (int i = c1.length-1; i >= 0;i--){
//如果当前长度取到 c2 的最前位,则停止取值 否则索引越界
if (subLen > i){
if (inTmp > 0 ){
//如果当时进位是1 则需要加上进位的值
int result = c1[i] + inTmp - 48;//减去48 是char转int ascii 转码问题
if (result>=10){
//如果大于10 则进位为1 应该加入到下次计算当中
result = result - 10;
inTmp=1;
}else{
inTmp=0;//没有进位 重置为0
}
sb.append(result);
}else{
//进位为0 直接取c1的数
sb.append(c1[i] - 48);
}
}else{
//c2 应该减去差异长度取得最后一位
int result = inTmp + c1[i] + c2[i - subLen] - 48 * 2;//只是一个个位数相加 减去48 是char转int ascii 转码问题
if (result>=10){
//如果大于10 则进位为1 应该加入到下次计算当中
result = result - 10;
inTmp=1;
}else{
inTmp=0;//没有进位 重置为0
}
sb.append(result);
}
}
System.out.println(sb.reverse().toString());
System.out.println("=====================================");
System.out.println(new BigDecimal(s1).add(new BigDecimal(s2)));