算法例子:两个大数字符串相加(java)
程序员文章站
2022-03-21 17:37:32
...
1.算法例子
计算两个数字字符串相加.
例如:
s1 = “8763845638363774673957584937685934737”;
s2 = “763845638363774673957584937685934”;
计算s1与s2的和.
2.算法设计
1.将两个字符串转化成char数组 c1[],c2[].
2.定义个存储结果数组,result[];其长度为c1和c2数组长度的最大值+1,因为两个数相加,最大值为长度进一位.
3.逆向遍历char两个数组.
4.取出值两个值.n[i],n[j].result[max(i,j)]此时存储的是进位值.
4.1. temp=n[i]+n[j]+result[max(i,j)];
4.2.将个位:t1=temp%10; 十位:t2=temp/10;
将十位存储到result[max(i,j)],个位存储到result[max(i,j)+1].
5.最后再把未遍历的值.走一遍第步即可.(因为字符串长度可能不一致.)
3.算法结果
s1:8396
s2:93725
s1+s2=102121
s1:8763845638363774673957584937685934737
s2:763845638363774673957584937685934
s1+s2=8764609484002138448631542522623620671
4.算法实现
4.1.相加方法
/**
* 合并两个大数据字符串
*
* @param numStr1 第一个数字字符串
* @param numStr2 第二个数字字符串
* @return 计算的结果
*/
public static String bigNumAdd(String numStr1, String numStr2) {
//1.将字符串转化成char数组
int numStr1Len = numStr1.length();
int numStr2Len = numStr2.length();
char[] n1Array = numStr1.toCharArray();
char[] n2Array = numStr2.toCharArray();
//2.声明一个数组,长度为:两个数组的长度最大值+1.(因为任何两个数相加结果最大为大值进一位)
int[] resultInt = new int[numStr1Len < numStr2Len ? numStr2Len + 1 : numStr1Len + 1];
//3.逆向遍历两个数组
int i, j, maxIndex;
int temp, t1, t2;//t1存储个位,t2存储十位
for (i = numStr1Len - 1, j = numStr2Len - 1; i >= 0 && j >= 0; i--, j--) {
//3.1 temp=num1+num2+resultChar[maxIndex+1](因为)
maxIndex = i > j ? i : j;
temp = Integer.parseInt(String.valueOf(n1Array[i]))
+ Integer.parseInt(String.valueOf(n2Array[j]))
+ resultInt[maxIndex + 1];
//3.2 如果temp小于10,那么将余数存储到对应位置即可
//3.3 如果temp大于等于10,那么将余数存储到对应位置并且将是十位存储到个位位置的前一位.
t1 = temp % 10;
t2 = temp / 10;
resultInt[maxIndex + 1] = t1;
resultInt[maxIndex] = t2;
}
//4.遍历剩下未遍历的,计算添加到对应的resultInt位置即可
if (i >= 0) {
for (; i >= 0; i--) {
temp = Integer.parseInt(String.valueOf(n1Array[i])) + resultInt[i + 1];
t1 = temp % 10;
t2 = temp / 10;
resultInt[i + 1] = t1;
resultInt[i] = t2;
}
}
if (j >= 0) {
for (; j >= 0; j--) {
temp = Integer.parseInt(String.valueOf(n2Array[j])) + resultInt[j + 1];
t1 = temp % 10;
t2 = temp / 10;
resultInt[j + 1] = t1;
resultInt[j] = t2;
}
}
//5.resultInt的值就是最后所求的结果, 将resultInt转化成字符串即可.
int size = resultInt.length;
StringBuilder sb = new StringBuilder();
for (i = 0; i < size; i++) {
//表示第一位是0,那么就是未进行进位,不需要添加到字符串中.
//后面的都需要拼接到字符串
if (i == 0 && resultInt[i] == 0) {
continue;
}
sb.append(resultInt[i]);
}
return sb.toString();
}
4.2.调用示例
public static void main(String[] args) {
String s1 = "8396";
String s2 = "93725";
String result = bigNumAdd(s1, s2);
System.out.println("s1:" + s1);
System.out.println("s2:" + s2);
System.out.println("s1+s2=" + result);
s1 = "8763845638363774673957584937685934737";
s2 = "763845638363774673957584937685934";
result = bigNumAdd(s1, s2);
System.out.println("s1:" + s1);
System.out.println("s2:" + s2);
System.out.println("s1+s2=" + result);
}
如果有好的实现方法,还请大家提出来,共同学习.
上一篇: tokitsukaze and Soldier 贪心
下一篇: 反转单向链表(Java)