本文分析和实现了两个大整数相加的思路和做法
1.首先,由于计算机表示的整数范围有限,当加数的位数超过计算机所能表示的范围时就需要用到这里的算法。由于整数过大,不能一次完成相加,我们猜想能否将两个整数存储到数组中,然后逐位相加。当然,这里实现的方法就是基于此。代码如下
public class bigIntegerSum {
//两个大整数相加,这里将两个整数分别存储到数组中,即拆分成一位进行相加,也可以将大整数拆分成9位(int类型最多至此10位,防止溢出,分成9位)
private String integer1;
private String integer2;
private int[] array1; //储存整数1
private int[] array2; //储存整数2
private int[] result; //储存结果
public bigIntegerSum(String integer1,String integer2){
this.integer1=integer1;
this.integer2=integer2;
}
public String getSum(){ //计算两个大整数的和并返回
int maxLength=integer1.length()>=integer2.length()?integer1.length():integer2.length();
array1=new int[maxLength+1]; //对齐
array2=new int[maxLength+1];
result=new int[maxLength+1]; //结果数组的长度要比较大的整数长度大一
for(int i=0;i<integer1.length();i++){
array1[i]=integer1.charAt(integer1.length()-1-i)-'0'; //将整数倒叙储存到数组中
}
for(int i=0;i<integer2.length();i++){
array2[i]=integer2.charAt(integer2.length()-1-i)-'0'; //将整数倒叙储存到数组中
}
for(int i=0;i<maxLength;i++){
int tem=array1[i]+array2[i]+result[i];
if(tem>=10) { //有进位的时候,将进位存到结果的下一位
result[i + 1] = 1;
result[i]=tem-10;
}else result[i]=tem;
}
StringBuilder value=new StringBuilder();
int tag=0;
for(int i=result.length-1;i>=0;i--){ //找到结果中第一个非0值得位置
if(result[i]!=0){
tag=i;
break;
}
}
for(int i=tag;i>=0;i--){ //将结果逆序存储
value.append(result[i]);
}
String Sum=value.toString();
return Sum;
}
public static void main(String[] args){
bigIntegerSum bigIntegerSum=new bigIntegerSum("123","2984");
String value=bigIntegerSum.getSum();
System.out.print(value+" "+value.length());
}
}
2. 上述方法时间复杂度为O(n),其实可以继续优化。思路如下:上述方法中我们是把整数拆分成精度为1的数进行相加的,其实,计算机的表达能力很强大。int类型的数的范围是多少我就不写了,(懒得百度)位数是10位,为了防止溢出,我们可以把大整数分为9位的小整数,然后进行相加。