实现2个超大数的加法运算

简介: 一道笔试题~实现2个超大数据的加法运算,这2个超大数,意思就是long也装不下的数,就顶大概100位吧。这道题其实看上去很简单,但是实际上涉及到的知识点还是很多的,非常考验一个人的程序设计能力和对API的熟悉程度。

一道笔试题~实现2个超大数据的加法运算,这2个超大数,意思就是long也装不下的数,就顶大概100位吧。


这道题其实看上去很简单,但是实际上涉及到的知识点还是很多的,非常考验一个人的程序设计能力和对API的熟悉程度。


思路很简单,这么大的数,long都存不下,那只能存在String中了,然后将每个数字取出,放到数组,由最末位开始计算,算加法,判断是否进位,进位则前位+1,若超过长度,则copy到新的数组。


下面上代码:

public class BigInt {

	private int[] digitals;

	public BigInt(String inputDigitals) {
		StringBuffer sb = new StringBuffer(inputDigitals);
		String string = sb.reverse().toString();
		digitals = new int[string.length()];
		for (int i = 0; i < string.length(); i++) {
			digitals[i] = Integer.valueOf(string.substring(i, i + 1));
		}
	}

	private int[] instance() {
		return digitals;
	}

	public static String bigAdd(BigInt b1, BigInt b2) {
		String result = "";
		boolean falg = false;
		int[] c1;
		int[] c2;
		int[] c3 = null;
		if (b1.instance().length >= b2.instance().length) {
			c1 = b1.instance();
			c2 = b2.instance();
		} else {
			c1 = b2.instance();
			c2 = b1.instance();
		}

		for (int i = 0; i < c2.length; i++) {
			if (c1[i] + c2[i] < 10) {
				c1[i] = (c1[i] + c2[i]);
			} else if (c1[i] + c2[i] >= 10) {
				c1[i] = (c1[i] + c2[i] - 10);
				if ((i + 1) < c1.length) {
					c1[i + 1] = (c1[i + 1] + 1);
				} else {
					falg = true;
					c3 = new int[c1.length + 1];
					System.arraycopy(c1, 0, c3, 0, c1.length);
					c3[c1.length] = 1;
				}
			}
		}
		if (falg) {
			for (int i : c3) {
				result += i;
			}
		} else {
			for (int i : c1) {
				result += i;
			}
		}
		return new StringBuffer(result).reverse().toString();
	}
}

Test:

public class Test {

	public static String s2 = "431399914813";
	public static String s1 = "831399924";

	public static void main(String[] args) {
		String result = BigInt.bigAdd(new BigInt(s1), new BigInt(s2));
		System.out.println(result);
	}
}

结果就不贴了,大家都懂的。


PS :程序中有些地方处理比较烦的原因是字符、byte、int之间的转化,也许写的不是很完善,有不妥的地方请指出,写完后发现,其实这种方法效率上有很大能改善的地方,这里是将每个字符取出来,其实可以充分利用存储空间,取多位进行计算,这样可以更好的提高效率。

目录
相关文章
|
1月前
|
JavaScript 前端开发 大数据
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
|
7月前
|
存储 数据处理
计算机数据的表示及运算
计算机数据的表示和运算是计算机系统中非常重要的概念。计算机使用二进制来表示和处理数据,其中包括整数、浮点数和字符等不同类型的数据。下面将详细介绍计算机数据的表示和运算。 1. 二进制表示:计算机使用二进制系统来表示数据。二进制系统由0和1两个数字组成,每一位称为一个比特(bit)。比特是计算机中最小的存储单位,可以表示一个二进制数值(0或1)。 2. 整数表示:计算机使用补码表示整数。补码是一种用于表示负数的方法,它将负数的最高位设为1,正数的最高位设为0。补码表示可以保证负数的运算结果仍然是有效的。 3. 浮点数表示:计算机使用浮点数表示实数。浮点数由两个部分组成:尾数和指数。尾数表示
114 0
|
18天前
|
机器学习/深度学习 存储 算法
位运算是一种什么运算方式
位运算是一种什么运算方式
17 1
|
7月前
|
存储 算法 数据处理
数据的表示及运算
一、数据的表示及运算 数据的表示和运算是计算机系统中非常重要的概念,它们决定了计算机如何处理和操作数据。 1. 数据的表示:计算机使用二进制(0和1)来表示和存储数据。二进制是一种只有两个状态的编码方式,可以通过开关电路的开和关来表示0和1。计算机将二进制编码与不同的数据类型关联,例如整数、浮点数、字符等。 2. 整数运算:计算机可以对整数进行基本的算术运算,包括加法、减法、乘法和除法。这些运算是通过电子电路中的逻辑门实现的,逻辑门可以对二进制数进行逻辑运算和移位操作。 3. 浮点数运算:计算机可以进行浮点数的运算,浮点数是一种用于表示带有小数部分的数值的数据类型。浮点数运算涉及到浮点数的表示
54 0
|
4月前
|
算法
你知道几种乘法的计算方式?
你知道几种乘法的计算方式?
38 0
|
9月前
|
人工智能 测试技术
MoonLight的运算问题
MoonLight的运算问题
60 0
|
11月前
|
人工智能 算法 C++
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
|
开发者 索引 Python
数值运算
快速学习数值运算
69 0
数值运算
|
开发者 索引 Python
数值运算|学习笔记
快速学习数值运算
68 0