ArrayList应用:高精度算法
2012-09-20 00:00
190 查看
饿了一下午,机子也马上断电了,这是闹哪样啊...
好嘞,对超大数据的加减乘除等运算,计算机没办法直接处理,我们只好想办法进行模拟运算了。在我的进行中的项目中我希望通过这样的算法来实现简单的加密和解密。
通过Java集合框架中的ArrayList可以轻松实现高精度整数加法:
创建一个类来封装字段和需要的方法。需要包含的字段是一个ArrayList实例,用于存储每一位数字。各位数被封装在Integer类型的对象里边,因为所有实现Collection的集合框架要求加入的元素是类类型而非基本类型。
对方法的一些说明:
通过String对象来实例化的方法中,通过:
来获取数值,如2的值由 '2'-'0'获得。
对于ArrayList的add方法,把新元素尾插到数组中,因此在完成部分和的加法后需要通过Collections的静态方法进行一个倒置以获得正确的最终的和。
backward()方法,从末尾开始取数据:如1234567,index==0的元素是7,index==1的元素是6,以此类推。
差不多就这样咯,吃饭去...
好嘞,对超大数据的加减乘除等运算,计算机没办法直接处理,我们只好想办法进行模拟运算了。在我的进行中的项目中我希望通过这样的算法来实现简单的加密和解密。
通过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,以此类推。
差不多就这样咯,吃饭去...
相关文章推荐
- OAF_开发系列17_实现OAF数组应用Vector / Hashmap / Hashtable / Arraylist(案例)
- ArrayList应用
- C# []、List、Array、ArrayList 区别及应用
- 自动装箱和拆箱 枚举 反射 数组反射的应用。ArrayList和HashSet
- C#ArrayList简单应用
- 【转】Android学习笔记——hashmap、arraylist(vector)与listview的应用
- arraylist的应用
- winform程序之录入删除显示人员应用了一点arraylist(简单)
- C# []、List、Array、ArrayList 区别及应用
- 解析C#中[],List,Array,ArrayList的区别及应用
- C#ArrayList简单应用
- C# []、List、Array、ArrayList 区别及应用
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- C#_C#中[],List,Array,ArrayList的区别及应用
- ArrayList 集合的应用
- Array和Arraylist的应用辨析
- 网易_Vector,Arraylist,LinkedList的区别和应用场景
- winform程序之人员选择listbox控件应用了一点arraylist(简单)
- java集合框架:ArrayList应用——去除ArrayList中的重复元素
- C# []、List、Array、ArrayList 区别及应用