(轉(zhuǎn)貼) 超大整數(shù)相加,超過(guò)了long的范圍,你要怎么做!

           

          引用:

           這個(gè)只能夠用字符串的形式來(lái)處理了,因?yàn)橛?jì)算機(jī)能夠處理的最大是long型,本文以字符串的形式來(lái)進(jìn)行超大數(shù)據(jù)的相加,理論上只要你的內(nèi)存允許,相加多大的數(shù)都可以。

          /**

           * 超大整數(shù)相加:

           * 題目要求:如果系統(tǒng)要使用超大整數(shù)(超過(guò)long的范圍),請(qǐng)你設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)這種

           * 超大型數(shù)字以及設(shè)計(jì)一種算法來(lái)實(shí)現(xiàn)超大整數(shù)的加法運(yùn)算

           * @author Administrator

           *

           */

          public class VeryBigNumAdd {

           

              /**

               * @param args

               */

              public static void main(String[] args) {

                 // TODO Auto-generated method stub

                 /*

                 String a="1223232";

                 for(int i=a.length()-1;i>=0;i--)

                 {

                     System.out.print(a.charAt(i));

                 }

                 */

                 VeryBigNumAdd vbn=new VeryBigNumAdd();

                 String a="123453243455535634535252345234677576252241234123523453664563634";

                 String b="123453243455535634535252345234677576252241234123523453664563634";

                 String result=vbn.doAdd(a,b);

                 System.out.println("result:"+result);

              }

              /**

               *

               * @param a 加數(shù)字符串1

               * @param b 加數(shù)字符串2

               * @return 結(jié)果字符串

               * 分析:

               * 1、取得兩個(gè)字符串的長(zhǎng)度

               * 2、把兩個(gè)的長(zhǎng)度做比較,并得出較長(zhǎng)的長(zhǎng)度,及較短的長(zhǎng)度

               * 3、把長(zhǎng)度較短的加數(shù)字符串,在左面補(bǔ)0,使之與較長(zhǎng)的字符串一樣長(zhǎng)

               * 4、從最高位,一個(gè)個(gè)數(shù)的取出來(lái)相加,當(dāng)然首先得轉(zhuǎn)換為整型

               * 5、設(shè)置進(jìn)位,如果兩個(gè)數(shù)相加及加上進(jìn)位大于等于10,并且這不是最左邊一個(gè)字符相加,相加結(jié)果等于

               *    (取出1+取出2+進(jìn)位)-10,并把進(jìn)位設(shè)為1;如果沒(méi)有大于10,就把進(jìn)位設(shè)為0,如些循環(huán),把

               *    相加的結(jié)果以字符串的形式結(jié)合起來(lái),就得到最后的結(jié)果

               */

              String doAdd(String a,String b)

              {

                 String str="";

                 int lenA=a.length();

                 int lenB=b.length();

                 int maxLen=(lenA>lenB) ? lenA : lenB;

                 int minLen=(lenA<lenB) ? lenA : lenB;

                 String strTmp="";

                 for(int i=maxLen-minLen;i>0;i--)

                 {

                     strTmp+="0";

                 }

                 //把長(zhǎng)度調(diào)整到相同

                 if(maxLen==lenA)

                 {

                     b=strTmp+b;

                 }else

                     a=strTmp+a;

                 int JW=0;//進(jìn)位

                 for(int i=maxLen-1;i>=0;i--)

                 {        

                     int tempA=Integer.parseInt(String.valueOf(a.charAt(i)));

                     int tempB=Integer.parseInt(String.valueOf(b.charAt(i)));

                     int temp;

                     if(tempA+tempB+JW>=10 && i!=0)

                     {

                        temp=tempA+tempB+JW-10;

                        JW=1;

                     }

                     else

                     {

                        temp=tempA+tempB+JW;

                        JW=0;

                     }        

                     str=String.valueOf(temp)+str;        

                 }

                 return str;

              }

           

          }

           

          原帖地址: http://blog.csdn.net/fenglibing/archive/2007/08/23/1756773.aspx

              
              其實(shí)java 本身也提供了api ,java.math.BigInteger;import java.math.BigDecimal; 也可以實(shí)現(xiàn)。

          code :

          package com.kangdy.test;

          import java.math.BigInteger;
          import java.math.BigDecimal;

          public class NumberTest {
           public static void main(String args[]){
            BigInteger b1= new BigInteger("2222222222222222222222222");
            BigInteger b2= new BigInteger("8888888888888888888888888");
            BigDecimal b3 = new BigDecimal("66666666666666666666666666");
            BigDecimal b4 = new BigDecimal("9999999999999999999999999999");
            System.out.println(b1.add(b2).toString());
            System.out.println(b3.add(b4).toString());
           }
          }

          這里只是給出簡(jiǎn)單的例子。



          posted on 2010-12-10 14:06 AK47 閱讀(932) 評(píng)論(0)  編輯  收藏 所屬分類: java相關(guān)

          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 大安市| 清镇市| 云龙县| 焉耆| 封开县| 铅山县| 体育| 万源市| 镇江市| 长岛县| 岑溪市| 雅安市| 奉节县| 兴文县| 武胜县| 琼结县| 怀化市| 铁岭县| 道真| 托克逊县| 松江区| 北碚区| 庆安县| 吕梁市| 延长县| 抚远县| 东兴市| 垣曲县| 安义县| 雷山县| 汽车| 合肥市| 杂多县| 东平县| 永胜县| 祁连县| 固安县| 无棣县| 张家港市| 萍乡市| 无锡市|