Java大26进制大整数相加_大整数相加

前言

Q:有两个大整数,大到 long 型都无法存放,如何实现它们相加?

A:。。。

思路

要解决这个问题,有两个问题需要解决:

如何存储两个大整数

相加

如果 long都无法存储,那么,这个数肯定非常大,只能使用其它方式存储了。我们可以使用字符串来存储数据,字符串不限长度,再大的数字都能存下来。但另一个问题就来了,字符串是不能相加的

回想整数相加,如果我们手动在纸上运算,先将数字从个位数开始对齐,然后一一相加,结果大于10则进位,如下图:

4941d05b486f

如果将字符串元素存入数组中,遍历数组,从个位开始相加,注意进位,结果依然保存在一个数组当中,模拟手动计算的方式,最后肯定能得出正确结果。

实现

public static int[] bigNumAdd(String s1, String s2){

//根据字符串创建int型 数组

int[] n1 = createIntArray(s1);

int[] n2 = createIntArray(s2);

//结果数组的长度,应该是最长数组长度加1,因为两个数相加,最多结果增加1位数,不可能增加两位及以上

int rLength = n1.length > n2.length ? n1.length + 1 : n2.length + 1;

int[] result = new int[rLength];

//将两个数组倒序,以便个位数在数组前头,方便计算,实现对齐

reverseArray(n1);

reverseArray(n2);

int temp = 0;

int bTemp = 0;

int num1 = 0;

int num2 = 0;

//遍历次数为result.length - 1,就是最长相加数组长度

for (int i = 0; i < result.length - 1; i++) {

//保证两个相加数不会数组越界

if (i < n1.length) {

num1 = n1[i];

}else {

num1 = 0;

}

if (i < n2.length) {

num2 = n2[i];

}else {

num2 = 0;

}

//两个同位置的数字相加,注意还要加原本位置上的结果元素,因为前一步计算中可能产生进位

temp = num1 + num2 + result[i];

//计算进位,如果相加结果大于10,肯定有进位,因为是两个数相加,进位值只能是1

if (temp >= 10) {

bTemp = 1;

temp = temp - 10;

}else {

bTemp = 0;

}

//设置当前位的结果数值以及下一位的进位值

result[i] = temp;

if (bTemp > 0) {

result[i+1] = bTemp;

}

}

//除去结果中高位多余的0

result = removeZero(result);

//再将倒序结果,得到期望的结果值

reverseArray(result);

System.out.println(" bigNumAdd " + Arrays.toString(result));

return result;

}

具体实现如上,相加地方都有对应说明,应该比较容易懂。具体代码可以查看本人的github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值