您的位置:首页 > 编程语言 > Java开发

java大数加减乘除

2013-01-14 16:00 387 查看
package java1;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Pattern;

public class BigInteger {

private int[] val;

private int sign; //nagetive sign ,1 表示是负数,0表示是正数





/**

* 构造函数

* */

public BigInteger(String value){

String valTemp=null;



if(value.charAt(0)=='-')

{

sign=1;

valTemp=value.substring(1);

}

else

{

sign=0;

valTemp= value;

}

Pattern pattern = Pattern.compile("[0-9]*");

if(pattern.matcher(valTemp).matches() )

{

byte[] numberByte=makePositive(subtractZero(valTemp).getBytes());

val=byteToInt(numberByte);

}

else

{

throw new NumberFormatException("Illegal digit");

}



// for(int i=0;i<val.length;i++)

// System.out.print(val[i]);

// System.out.println();

}



/**

* 获取数值

* */

public String getBigIntegerValue(){

//String returnValue=null;

//去掉开头的0

int index=val.length-1;

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

{

if(val[i]==0)

{

index=i-1;

}

else

break;

}

int [] middleVlaue=makePositive(val,index);

StringBuilder s= new StringBuilder();

if (val.length>0){

if(sign==1) s.append('-');

for(int i=0;i<=middleVlaue.length-1;i++)

s.append(middleVlaue[i]);



}

return s.toString();



}



/**

* 加法

* */

public BigInteger add(BigInteger other){

BigInteger bigResult= new BigInteger("0");

if(this.sign==other.sign)

{

bigResult.val= add(this.val,other.val);

bigResult.sign=this.sign;

}

else

{

if(compare(this.val,other.val))

{

bigResult.sign=this.sign;

bigResult.val=subtract(this.val,other.val);

}

else

{

bigResult.sign =other.sign;

bigResult.val=subtract(other.val,this.val);

}

}

return bigResult ;

}

/**

* 比较大小

* */

private boolean compare(int[] a ,int[] b)

{

int aLength=a.length;

int bLength=b.length;

boolean flag=true;

if(aLength>bLength)

return true;

if(aLength<bLength)

return false;

else

{

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

{

if(a[i]==b[i])

continue;

if(a[i]>b[i])

{

// flag= true;

break;

}

else

{

flag=false;

break;

}



}

return flag;

}



}





private int[] add(int[] a ,int[] b)

{

int[] sumResult = null;

if(a.length<=b.length)

{

sumResult=new int[b.length+1];

for(int i=0;i<a.length;i++)

{



int middleValue=sumResult[i]+a[i]+b[i];

if(middleValue>=10)

{

sumResult[i+1]=middleValue/10;

sumResult[i]=middleValue%10;

}

else

sumResult[i]=middleValue;

}



}

else

sumResult=add(b,a);

for(int i=a.length;i<b.length;i++)

{

int middleValue=sumResult[i]+b[i];

if(middleValue>=10)

{

sumResult[i+1]=middleValue/10;

sumResult[i]=middleValue%10;

}

else

sumResult[i]=middleValue;

}



return sumResult;

}

private BigInteger subtract(BigInteger other){

BigInteger bigResult= new BigInteger("0");

if(this.sign==other.sign)

{

if(this.compare(this.val, other.val))

{

bigResult.val=this.subtract(this.val, other.val);

bigResult.sign=this.sign;

}

else

{

bigResult.val=this.subtract(other.val,this.val);

bigResult.sign=(other.sign==0)?1:0;

}

}

else

{

bigResult.sign=this.sign;

bigResult.val=this.add(this.val, other.val);



}



return bigResult;

}

/**

* 两个整形字符串相减,a>b

* */

private int[] subtract(int[] a ,int[] b){

int[] subractResult=new int[a.length];

for(int i=0;i<b.length;i++)

{

int middleValue=subractResult[i]+a[i]-b[i];

if(middleValue<0)

{

subractResult[i]=10-(Math.abs(middleValue)%10);

//if(i<a.length-1)

subractResult[i+1]=((Math.abs(middleValue)/10)+1)*(-1);}

else

subractResult[i]=middleValue;

}

for (int i=b.length;i<a.length;i++)

{

int middleValue=subractResult[i]+a[i];

if(middleValue<0)

{

subractResult[i]=Math.abs(middleValue)%10;

subractResult[i+1]=((Math.abs(middleValue)/10)+1)*(-1);

}

else

subractResult[i]=middleValue;

}

return subractResult;

}

/**

* 乘法

* */

public BigInteger multiply(BigInteger other){

BigInteger bigResult= new BigInteger("0");

if(this.sign==other.sign){

bigResult.sign=this.sign;

}

else

bigResult.sign=1;



if(this.compare(this.val, other.val)){

bigResult.val= multiply(this.val, other.val);}

else

bigResult.val= multiply( other.val,this.val);



return bigResult;



}

/**

* 乘法

* */

private int[] multiply(int[] a ,int [] b){

int[] multiplyResult=new int[a.length+b.length];

multiplyResult=multiply(a,b[0]);

for(int i=1;i<b.length;i++)

multiplyResult=add(multiply(a,b[i]*i*10),multiplyResult);

return multiplyResult;

}

private int[] multiply(int[]a ,int b){

int[] result=new int[a.length+1];

for(int i=0;i<a.length;i++)

{

int midddleValue=result[i]+a[i]*b;

if(midddleValue>=10){

result[i]=midddleValue%10;

result[i+1]=midddleValue/10;

}else

result[i]=midddleValue;

}

return result;

}

/**

* 除法

* */

public BigInteger divide(BigInteger other){

BigInteger divideResult=new BigInteger ("0");

StringBuffer sbuffer= new StringBuffer();

if(other.val.length==1 && other.val[0]==0)

{

throw new ArithmeticException("the dividend can't be 0");



}else{



if(this.sign==other.sign)

divideResult.sign=this.sign;

else

divideResult.sign=1;

divideResult.val=this.divideArray(this.val,other.val);

// int[] middleValue=this.divideArray(this.val,other.val);

//divideResult.val=makePositive(middleValue,middleValue.length) ;



return divideResult;

}



}

/**

*

* */

private int[] divideArray(int[] a,int[] b){

//StringBuffer sb= new StringBuffer();

int[] remainValue=new int[a.length];

int[] resultValue = new int[a.length+3];

//长度大于等于被除数长度

if(this.compare(a,b)){

int[] middleValue=new int[a.length];

middleValue=subIntArray(a,(a.length-b.length),b.length);

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

// a>b

int[] addDivide=new int[1];

int[] middleValue1=this.subtractZero(middleValue);

if(this.compare(middleValue1,b)){

List list=divide(middleValue1,b);

remainValue=(int[]) list.get(1);

resultValue[i]=resultValue[i]+(Integer)list.get(0);

if(i>=1)

{

addDivide[0]=a[i-1];

middleValue=subtractZero(this.add(multiply(remainValue,10),addDivide)) ;

}

}

else

{

if(i>=1)

{

addDivide[0]=a[i-1];

int[] mulValu=multiply( middleValue,10);

int[] middleValue2=this.add(mulValu,addDivide) ;

middleValue=middleValue2;

resultValue[i]=0;

}

}

}

}

else

{

resultValue[0]=0;

}

return resultValue;



}



/**

* a和b的长度一样

* */

private List divide(int[] a,int[] b)

{

int[] zeroArray={0};

int[] remainValue=a;

List list = new ArrayList();

int divideResult=0;

for(int i=0;i<=9;i++){

if(compare(a,b)){

remainValue=this.subtract(remainValue,b);

int[] valueTemp=this.subtractZero(remainValue);

if(!this.compare(valueTemp,b))

{

//System.out.println("i的值为:"+i);

divideResult=i+1;

break;

}

}

else{

divideResult=0;

}



}

list.add(divideResult);

list.add(remainValue);

return list ;

}

private int[] subIntArray(int[] a,int index,int length)

{

int[] middleValue=new int[length];

for(int i=index;i<index+length;i++)

{

middleValue[i-index]=a[i];

}

return middleValue ;

}

/**

* 反转字符数组

* */

private byte[] makePositive(byte[] a)

{

byte [] result = new byte[a.length];



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

result[a.length-i-1]=a[i];

return result;

// val[i]=numberByte[i]& 0xff;

}

/**

* 反转字符数组

* index=a.length-1

* */

private int[] makePositive(int[] a,int index)

{

int [] result = new int[index+1];



for(int i=index;i>=0;i--)

result[index-i]=a[i];

return result;

// val[i]=numberByte[i]& 0xff;

}

/**

* 字节转换为数字

* */

private int[] byteToInt(byte[] a){

int[] result=new int[a.length];

for (int i=0;i<a.length;i++)

{

result[i]=a[i]-48;

}

return result;

}

/**

* 数字转换为字节

* */

public static byte[] intToByte(int[] a){

byte[] result=new byte[a.length];

for (int i=0;i<a.length;i++)

result[i]= (byte) a[i];

return result;

}

/**

* 去掉头部的0

*

* */

private String subtractZero(String value){

int flag=0;

for(int i=0;i<value.length();i++)

{

if( value.charAt(i)=='0')

flag=flag+1;

else

break;



}

if(flag==value.length())

return "0";

else

return value.substring(flag);

}

/**

* 去除整型数组中最高位的0

* */

private int[] subtractZero(int[] a)

{

//int[] resultIntArray;

int length=a.length;

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

{

if(a[i]!=0)

{

length=i;

break;

}

}

if(a.length==length)

{

int[] resultIntArray={0};

return resultIntArray;

}

else

{

int[] resultIntArray= new int[length+1];

for(int i=0;i<=length;i++)

resultIntArray[i]=a[i];

return resultIntArray;

}



}



public static void main(String args[]){

BigInteger a=new BigInteger("109");

BigInteger b=new BigInteger("5");



BigInteger c=a.divide(b);

System.out.println(c.getBigIntegerValue());

c=a.add(b);

System.out.println(c.getBigIntegerValue());

c=a.subtract(b);

System.out.println(c.getBigIntegerValue());

c=a.multiply(b);

System.out.println(c.getBigIntegerValue());



}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: