大整数相加

题目:

给出两个很大的整数,求出两个整数相加的和。

方式1:

思路:

第1步:创建两个整型数组,数组长度是较大整数的位数加1,把每一个整数倒序存储到数组中,整数的个位存储到数组下标为0的位置,最高位存于数组的尾部。

第2步:创建结果数组,结果数组的长度同样是较大整数的位数+1,加1的目的为进位做准备。

第3步:遍历两个数组,从左到右按照对应下标把元素两两相加,并处理进位。

第4步:把结果数组逆序,去掉首位的0,即为最终的结果。

public static String bigNumberSum(String bigNumberA, String bigNumberB) {
		int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();
		int[] arrayA = new int[maxLength + 1];
		for(int i = 0; i < bigNumberA.length(); i ++) {
			//减'0'是为了把字符串处理成int
			//否则'9'对应ASCII码为57
			//'0'对应48
			arrayA[i] = bigNumberA.charAt(bigNumberA.length() - 1 - i) - '0';
		}
		int[] arrayB = new int[maxLength + 1];
		for(int i = 0; i < bigNumberB.length(); i ++) {
			arrayB[i] = bigNumberB.charAt(bigNumberB.length() - 1 - i) - '0';
		}
		int[] result = new int[maxLength + 1];
		for(int i = 0; i < result.length; i ++) {
			int temp = result[i];
			temp += arrayA[i];
			temp += arrayB[i];
			if(temp >= 10) {
				result[i + 1] = 1;
				temp = temp - 10;
			}
			result[i] = temp;
		}
		StringBuilder sb = new StringBuilder();
		boolean findFirst = false;
		for(int i = result.length - 1; i >= 0; i --) {
			if(!findFirst) {
				if(result[i] == 0) {
					continue;
				}
				findFirst = true;
			}
			sb.append(result[i]);
		}
		
		return sb.toString();
	}

方式2:

将大数处理成可以被直接进行运算的int型(-2147483648~2147483647),此处取9位,如此一来,内存占用空间和计算次数都相应减少。

public static String bigNumberSum2(String bigNumberA,String bigNumberB) {
		int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();
		//不管是否整除都多一组,为进位做准备
		int group = maxLength / 9 + 1;
		int[] groupA = new int[group];
		int[] groupB = new int[group];
		//补齐长度
		while(bigNumberA.length() < group*9) {
			bigNumberA = "0" + bigNumberA;
		}
		while(bigNumberB.length() < group * 9) {
			bigNumberB = "0" + bigNumberB;
		}
		for(int i = 0; i < group; i ++) {
			groupA[i] = Integer.parseInt(bigNumberA.substring(i*9, (i+1)*9));
			groupB[i] = Integer.parseInt(bigNumberB.substring(i*9, (i+1)*9));
		}
		int result[] = new int[group];
		int carry = 0;
		for(int i = group - 1; i >= 0; i--) {
			String temp = (groupA[i] + groupB[i] + carry) + "" ;
			if(temp.length() > 9){
				int m = temp.length() % 9;
				carry = Integer.parseInt(temp.substring(0,m));
				result[i] = Integer.parseInt(temp.substring(m));
			} else {
				carry = 0;
				result[i] = Integer.parseInt(temp);
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < group; i ++) {
			if(result[i] == 0) {
				continue;
			}
			sb.append(result[i]);
		}
		return sb.toString();
	}

工具类BigInteger和BigDecimal的底层实现同样是把大数字转换位int型的数组,进行计算的。

参考:漫画算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潭影空人心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值