java大数加减乘除

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());
 
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值