餓了一下午,機子也立刻斷電了,這是鬧哪樣啊...java
好嘞,對超大數據的加減乘除等運算,計算機沒辦法直接處理,咱們只好想辦法進行模擬運算了。在個人進行中的項目中我但願經過這樣的算法來實現簡單的加密和解密。git
經過Java集合框架中的ArrayList能夠輕鬆實現高精度整數加法:算法
建立一個類來封裝字段和須要的方法。須要包含的字段是一個ArrayList實例,用於存儲每一位數字。各位數被封裝在Integer類型的對象裏邊,由於全部實現Collection的集合框架要求加入的元素是類類型而非基本類型。數組
package realizationofarraylist; import java.util.ArrayList; import java.util.Collections; public class HighPrecision { ArrayList<Object> Numbers;//用於按位存放數字的ArrayList字段 public HighPrecision(){//默認無參的構造方法 final int INI=500;//初始大小設爲500 Numbers=new ArrayList<Object>(INI); } public HighPrecision(String s){ final char LOWEST='0'; final char HIGHEST='9'; Numbers=new ArrayList<Object>(s.length()); char c; int digit; for(int i=0;i<s.length();i++){ c=s.charAt(i); if((LOWEST<=c)&&(HIGHEST>=c)){//保證字符是數字,不然剔除 digit=c-LOWEST; Numbers.add(new Integer(digit)); } } } public String toString(){//轉換成String的toString方法 final String EMPTY=""; String s=EMPTY; for(int i=0;i<Numbers.size();i++){ s+=Numbers.get(i); } return s; } public void add(HighPrecision other){//區別於ArrayList的add()方法,這是模擬的和運算 final int BASE=10; int larger,//保存兩個Digits中較大的size apart,//部分和 carrayBit=0; //進位 HighPrecision sum=new HighPrecision(); if(Numbers.size()>other.Numbers.size()) larger=Numbers.size(); else larger=other.Numbers.size(); for(int i=0;i<larger;i++){ apart=backwards(i)+other.backwards(i)+carrayBit; carrayBit=apart/BASE;//獲取進位 sum.Numbers.add(new Integer(apart%BASE));//餘數就是相加後這一位的值咯 } if(carrayBit==1)//post:若是最後一次和也有進位。其實我以爲這裏也能夠把 //循環條件改爲largerSize+1這樣就不用處理了 sum.Numbers.add(new Integer(carrayBit)); Collections.reverse(sum.Numbers);//倒轉sum.Digits而後賦給Digits字段 Numbers=sum.Numbers; } public int backwards(int index) {//選取倒數第index個元素 if(index>=Numbers.size()) return 0; else return ((Integer)Numbers.get(Numbers.size()-index-1)).intValue(); } }
對方法的一些說明:
經過String對象來實例化的方法中,經過:框架
c=digit-LOWEST;
來獲取數值,如2的值由 '2'-'0'得到。
對於ArrayList的add方法,把新元素尾插到數組中,所以在完成部分和的加法後須要經過Collections的靜態方法進行一個倒置以得到正確的最終的和。post
backward()方法,從末尾開始取數據:如1234567,index==0的元素是7,index==1的元素是6,以此類推。大數據
差很少就這樣咯,吃飯去...加密