您的位置:首页 > 其它

ArrayList应用:高精度算法

2012-09-20 00:00 190 查看
饿了一下午,机子也马上断电了,这是闹哪样啊...

好嘞,对超大数据的加减乘除等运算,计算机没办法直接处理,我们只好想办法进行模拟运算了。在我的进行中的项目中我希望通过这样的算法来实现简单的加密和解密。

通过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的静态方法进行一个倒置以获得正确的最终的和。

backward()方法,从末尾开始取数据:如1234567,index==0的元素是7,index==1的元素是6,以此类推。

差不多就这样咯,吃饭去...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息