ArrayList应用:高精度算法

    饿了一下午,机子也立刻断电了,这是闹哪样啊...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,以此类推。大数据

    差很少就这样咯,吃饭去...加密

相关文章
相关标签/搜索