题解 | #大数加法#
大数加法
http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475
//刚开始想的是用java自带的加法运算,会导致数字转换异常
//因为这里要求字符串的长度为10万,而Long类型的最大值为9223372036854775807,长度为19位,输入字符串转化为整数
//远远大于Long的最大值,所以这里不能用java自带的加法运算,而是要手动进行十进制的加法运算
//Long类型最大长度为19位,两个18位的数字相加最大为19位,不会超过long类型的最大值
//所以字符串分组长度设为18位
int lengths = s.length();
int lengtht = t.length();
//判断s,t分成几组
int s1 = (lengths%18==0)?lengths/18:(lengths/18+1);//s分组数量
int t1 = (lengtht%18==0)?lengtht/18:(lengtht/18+1);//t分组数量
//新建String数组,分别存储s,t字符串分组后的字符串数组
String[] strings = new String[s1];
String[] stringt = new String[t1];
//为字符串数组添加元素
for(int i=0;i<s1;i++){
if(i==s1-1){
strings[i] = s.substring(0, lengths-i*18);
}else{
strings[i] = s.substring(lengths-(i+1)*18, lengths-i*18);
}
}
for(int i=0;i<t1;i++){
if(i==t1-1){
stringt[i] = t.substring(0, lengtht-i*18);
}else{
stringt[i] = t.substring(lengtht-(i+1)*18, lengtht-i*18);
}
}
int temp = 0;//进位初始为0,两数相加大于10^18时标记进位1;
StringBuilder result = new StringBuilder();
int r = 1;
int p=0,q=0;
long jin = (long) Math.pow(10, 18);
while(p <s1 || q < t1 || temp > 0){
long a = (p >= s1)?0:Long.valueOf(strings[p++]);
long b = (q >= t1)?0:Long.valueOf(stringt[q++]);
long c = a+b+temp;
temp = 0;//进位复位为0;
// 计算进位
if(c>=jin){
c = c%jin;//大于等于10时,取个位数 ,进位标记1;
temp = 1;
}
StringBuilder cc = new StringBuilder(c+"");
//c位前面补0,补足18位
for(int i=0;i<18-(c+"").length();i++){
cc.insert(0,"0");
}
// System.out.println("jin:"+jin+ " 第"+ r++ +"趟循环 a :"+a+" b:"+ b +" c:"+ c +" temp:"+ temp +" cc:"+ cc); //将相加结果 result.insert(0,cc);
}
//去除前面多余的0
String newStr = result.toString().replaceFirst("^0*", "");
//全为0的情况
if(newStr.equals("")){
newStr = "0";
}
return newStr;