水蛭,[算法有必要死 第1期]大整数求和,宏碁

admin 2019-04-19 阅读:133

什么是大整数

大整数是指超出了核算机的表明规模的数水蛭,[算法有必要死 第1期]大整数求和,宏碁,这类数的根本运算无法运用加减乘除直接运算,一般能够运用数组存储大整数,运用字符串来表明这样的整数。数组的每一个元素对应整数的每一位。


已然现已按位存媚姐储了大整数,加法核算就能够运用原始的竖式进行,每一位别离核算,有进位则加到下一位。


大整数求和

给定两个大整数,核算它们的和,依据竖式的核算规矩进行按位运转;运用数组存储整数;


下面是大整数求和的算法过程:

  1. 将给定的大整数倒水蛭,[算法有必要死 第1期]大整数求和,宏碁序寄存到数组中,原因是竖式是从右开端核算,而习惯上拜访数组从左面开端。

  2. 创立寄存成果的数组,长度为较大水蛭,[算法有必要死 第1期]大整数求和,宏碁整数的位数+1

  3. 遍历两个数组,从左到右将两个数组对应方位的数和成果数组中对应的进位数相加

    a)  假如相加成果<10,则存储到成果数组

    b)  假如相加成果>10,则将成果除以10,余数寄存到成果数组,商寄存到成果数组的下一位水蛭,[算法有必要死 第1期]大整数求和,宏碁代表进位。

  4. 终究将成果数组逆序得到终究的成果

        &nbs芳华从爱上妈妈开端p;   

详细的Java代码如下:

public stati憨豆先生的黄金周c String&易思彤nbsp水蛭,[算法有必要死 第1期]大整数求和,宏碁;lar成婚铺床四句好话geIntegerSumImp(Strin金科信运送办理体系g numA,String numB){    int lengthA=numA.length();    int length加勒比女B=numB.length();    int maxLength=lengthA>lengthB?lengthA:lengthB+1;    int[] arrayA=new int[maxLe265g游戏浏览器ngth+1];    int[] arrayB=new int[maxLength+1];    int[] result=new int[maxLength+1];    int i=0; 绿色循环圈五行塔攻略//将字符串逆序存储到数组中    for(i=0;i<lengthA;i++) {      arr朱佳怡ayA[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]+baofarrayB[i];  //位数和进位相加      if(add<10) {  //没有进位        result[i]=add;        continue;      }      int remainder=add%10;  //余数      int quotient=add/10;  //商      result[i]=remainder;        if(i!=result.length-1) {           result[i+1]=quotient;      } 水蛭,[算法有必要死 第1期]大整数求和,宏碁  水蛭,[算法有必要死 第1期]大整数求和,宏碁 }    //再倍力泰将数组逆序得到终究的成果    String sum="";    int lastIndex=0;    for(i=maxLength-1;i>=0;i--) {  //去除数组终究的0      if(resul大竹爱子t[i]!=0) {        lastIndex=i;        break;      }    }     for(i=lastIndex;i>=0;i--) {      sum+=result[i];    } 节操安在   return sum行圆才智云;  }

大整数求和的根本过程如下图所示:


总结

在以上的算法中,有几个sw161小细节需求留意:

  • 核算时运用成果数组进行遍历,留意进位,终究一次循环不做进位

  • 逆序成果时,首要要去除去终究的0,由于result数组中默许初始化位habimi0


优化

大整数求和也有能够优化的景象,当位数足够大时,按位存储整数也会花费巨大的空间而且增大了运算次数;


为了优运算,能够一次在数字元素中存储多位,只需核算机能够表明这个多位的数即可;


比方加上有一个30位的数,依照原始办法,需求31长度的数组;假如依照9位拆分,每一存储一个9位数,这样只需求数组的长度位4,由于一个元素能够表明9位刘也行渣男数的巨细(int最多有10位数),当然也能够挑选运用long类型的数组,这样能够拆分为长度更小的数组,存储空间和运算次数都大大下降。