大整数相加(有详细说明)
既然是大整数,就肯定
不能用int,long
这些数据类型直接相加了,因为范围超出了,这里采用字符串和字符数组实现大整数相加
核心思想:对这个大整数从个位到最高位依次相加,同时记录进位,进位加到上一位
详细说明:
case1:两个整数长度一样,比如123+123,这样的就好操作了,直接每一位相加。
两个整数长度一样,比如75+16,还是每一位相加,5+5=11,这就得产生进位了,置这一位为(11-10)=1,同时产生carry进位1,然后 7+1+carry=9<10,输出结果就可以了。
两个整数长度一样,比如90+10,各位0+0=0,十位9+1=10,置10为0,产生进位,这一进位是最高位,另行操作就OK了。
case2: 第一个整数的长度比第二个整数的长度要长,比如12345+123,取12345和123长度相等的三位345与123相加,没有进位,最后将12并上。
第一个整数的长度比第二个整数的长度要长,比如12372+155,取12372的372和155相加,2和5相加,7和5相加=12,置为2,产生进位1。
第一个整数的长度比第二个整数的长度要长,比如12732+555,取12732的732和555相加,2+5,3+5,7+5=12,置为2,产生进位1,这个进位 就得加到12732的千位2上,使之变成3了 。
第一个整数的长度比第二个整数的长度要长,比如9999+1,取9999的个位9和1相加,得10,置为0,产生carry进位1,9999的十位9和carry相加 得10,置为0,又产生进位1,9999的百位和carry相加,得10,置0,carry=1,9999的千位和 carry相加得10,置0,carry=1,最后把1和产生得0000串起来得到结果10000
case3: 第二个整数的长度比第一个要长,比如12+12345,由于加法具有交换律,交换位置得到12345+12,这样就变成了case2,方法同case2。
public static void BigInteger(String s1,String s2){
char[] num1=s1.toCharArray();//第一个大整数 最高位num1[0],各位num1[num1.length-1]
char[] num2=s2.toCharArray();//第二个大整数 ......
String str=""; //定义字符串,将得到的每一位与之拼接
int carry=0; //进位标识
if(num1.length==num2.length){//第一种情况,两个数组长度一样,比如123456789+123456789
for(int i=num1.length-1;i>=0;i--){
int a=num1[i]-48+num2[i]-48+carry;
if(a>=10){
carry=1;
str=str+(a-10);
}else{
carry=0; //没有进位,置carry为0
str=str+a;
}
}
if(carry!=0){
str=str+carry;
}
char[] c=str.toCharArray();
for(int i=c.length-1;i>=0;i--){
System.out.print(c[i]);
}
}else if(num1.length>num2.length){//第二种情况,前边长后边短,比如12345+123
int j=num2.length-1; //和第三种情况(前边短后边长)类似,只需调换两个数组(这里第三种情况就不写了)
for(int i=num1.length-1;i>=0;i--){ //使其变成前边长后边短(加法具有交换律,变换一下结果不变)
if(i==num1.length-num2.length-1){ //短的有几位,长的也选出几位来,与之相加
break;
}
int a=num1[i]+num2[j]-48-48+carry;
j--;
if(a>=10){
carry=1;
str=str+(a-10);
}else{
carry=0;
str=str+a;
}
}
if(carry==0){ //这里就比较关键了,比如123+1,3+1之后小于10不进位,此时carry=0
String s="";
for(int i=0;i<num2.length-1;i++){
s=s+(num1[i]-48);
}
char[] c=str.toCharArray();
for(int i=c.length-1;i>=0;i--){
s=s+c[i];
}
System.out.print(s);
}else{ //比如129+3,9+3=12,产生了进位,这一个进位还得加给129中的十位2
int temp[]=new int[num1.length-num2.length];
for(int i=num1.length-num2.length-1;i>=0;i--){
temp[i]=num1[i]-48;
}
String s="";
for(int i=temp.length-1;i>=0;i--){
temp[i]=temp[i]+carry;
if(temp[i]>=10){
temp[i]=temp[i]-10;
carry=1;
}else {
carry=0;
break;
}
if(i==0){
break;
}
}
if(carry==1){ //这里的进位是所有的数字都操作完之后产生的进位,比如999+1,得到000,和一个1的进位
for(int i=0;i<temp.length;i++){ //这个1还得和000串起来
s=s+temp[i];
}
s=1+s;
}else{ //没有进位就不用串了
for(int i=0;i<temp.length;i++){
s=s+temp[i];
}
}
System.out.print(s); //输出结果
char c[]=str.toCharArray();
for(int i=c.length-1;i>=0;i--){
System.out.print(c[i]);
}
}
}
}