大整数求和其实很简单!

昨天参加了学校的程序设计大赛,最后一题就是单纯的大整数求和的实现,由于前面做的比较慢,最后没有来得及做,还是有点遗憾的。那么大整数是什么样的数?究竟有多大呢?求和又该怎么样实现?下面分别介绍这几点。

何为大整数

百度百科给出的定义如下:
大数在编程中表示超过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");
 	}
}

需要注意的一点就是由于我们是逆序做加法的,所以余数应该放在下一位,而商(进位标识)应该放在本位。

看完了代码再用图的形式看一下执行过程吧:

大整数求和

好了,大整数求和的基本思想就介绍到这里,下次见!

猜你喜欢

转载自blog.csdn.net/tianc_pig/article/details/84335579