字符串实现大整数相加(超详细讲解)

  • Post author:
  • Post category:其他




大整数相加(有详细说明)

既然是大整数,就肯定

不能用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]);
                }
            }
        }
    }



版权声明:本文为CSDN_Lrcx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。