大数相加
大数相加的核心思想就是对应位置的数相加后,再加上一次计算结果的进位,得到结果后,结果%10得到当前位置的数,结果/10得到进位,周而复始。
public static String add(String s1,String s2) {
StringBuffer res = new StringBuffer();
s1 = new StringBuffer(s1).reverse().toString();
s2 = new StringBuffer(s2).reverse().toString();
int len1 = s1.length();
int len2 = s2.length();
int max = len1>len2?len1:len2;
// 用0补齐到相同长度,方便计算
if(len1 < len2) {
for (int i = len1; i < len2; i++) {
s1+="0";
}
}else {
for (int i = len2; i < len1; i++) {
s2+="0";
}
}
int c = 0;//进位
for (int i = 0; i < max; i++) {
// 减0是可以直接拿到数字大小
int temp = (s1.charAt(i) - '0') + (s2.charAt(i) - '0') + c;
int cur = temp%10;//这是进位后的个位数
res.append(cur);//将这个数添加到结果中
c = temp/10;//进位
}
if(c>0) {//判断最后是否有进位大于0,如果有添加
res.append(c);
}
return res.reverse().toString();//反转输出
}
大数相乘
思路讲解可以看这一篇文章大数乘法[JAVA实现]-经典笔试题,核心还是多项式相乘的十字相乘法,下面是经过修改的具体实现
public String multify(String s1, String s2) {
int len1 = s1.length();
int len2 = s2.length();
int[] res = new int[len1 + len2];//存放的结果集
for (int i = 0; i < len1; i++) {
int n1 = s1.charAt(i) - '0';//减0直接得到0-9的数字大小
for (int j = 0; j < len2; j++) {
int n2 = s2.charAt(j) - '0';
res[i + j] += n1 * n2;//这是基于交叉相乘的思路,上面文章中有介绍
}
}
// 得到结果集,例如53*34,目前res=[15,29,12]
for (int i = res.length - 1; i > 0; i--) {
res[i - 1] += res[i] / 10;//将低位结果/10后就是进位,将进位加到i-1的位置
res[i] = res[i] % 10;//结果%10得到进位后当前位置的数
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < res.length-1; i++) {
sb.append(res[i]);//遍历进行结果拼接
}
return sb.toString();
}