昨天参加了学校的程序设计大赛,最后一题就是单纯的大整数求和的实现,由于前面做的比较慢,最后没有来得及做,还是有点遗憾的。那么大整数是什么样的数?究竟有多大呢?求和又该怎么样实现?下面分别介绍这几点。
何为大整数
百度百科给出的定义如下:
大数在编程中表示超过32位二进制位的数简单来说就是超出了计算机的表示范围的整数。对于这样的数,计算机没办法用基本的int,long类型存储,自然也无法进行计算,但是如果我们需要计算这样的数的和,又该如何实现呢?我们接着来看。
实现大整数求和
对于数值类型无法表示的数,我们可以使用字符串来存储这样一个数字的串。我们可以联想一下纯数学解决两个数的求和方法,我们通常会写成竖式的形式,对于这样的形式,需要两个步骤:一是简单的加法运算,二是进位运算,通过这样的方式可以将问题分解,更容易解决。
同样对于一个字符串,我们可以知道它的长度,也可以采用对应位相加判断进位的方式来实现大整数的加法。做一些小小的改变,由于我们通常都是从前往后遍历字符串,而竖式计算是从后往前的,所以我们将一个数字串首先逆序存储到数组中,最后再逆序输出就是最后的结果,下面看看具体的实现吧:
public class LargeIntegerSum {
public static void largeIntegerSumImp(String numA,String numB){
int lengthA=numA.length();
int lengthB=numB.length();
int maxLength=lengthA>lengthB?lengthA:lengthB+1;
int arrayA[]=new int[maxLength+1];
int arrayB[]=new int[maxLength+1];
int result[]=new int[maxLength+1];
//将字符串逆序存储到数组中
int i=0;
for(i=0;i<lengthA;i++) {
arrayA[i]=numA.charAt(lengthA-i-1)-'0';
}
for(i=0;i<lengthB;i++) {
arrayB[i]=numB.charAt(lengthB-i-1)-'0';
}
//进行大整数求和
for(i=0;i<result.length;i++) {
int add=result[i]+arrayA[i]+arrayB[i];
if(add<10) { //没有进位
result[i]=add;
continue;
}
int remainder=add%10; //有进位是余数
int quotient=add/10; //商,其实就是1
result[i]=remainder;
if(i!=result.length-1) { //防止越界
result[i+1]=quotient;
}
}
//再将数组逆序得到最终的结果
String sum="";
int lastIndex=0;
//去除末尾的所有0
for(i=maxLength-1;i>=0;i--) {
if(result[i]!=0) {
lastIndex=i;
break;
}
}
for(i=lastIndex;i>=0;i--) {
sum+=result[i];
}
//输出结果
System.out.print(sum);
}
public static void main(String[] args) {
LargeIntegerSum.largeIntegerSumImp("12445544","556533483");
}
}
需要注意的一点就是由于我们是逆序做加法的,所以余数应该放在下一位,而商(进位标识)应该放在本位。
看完了代码再用图的形式看一下执行过程吧:
好了,大整数求和的基本思想就介绍到这里,下次见!