java 进行超大整数的加减乘除四则运算(自己实现的BigInteger)


public class MyBigInteger {
	private StringBuffer data;
	
	
	public MyBigInteger(){
		data = new StringBuffer("0");
	}
	public MyBigInteger(String str){
		data = new StringBuffer(str);
	}
	public MyBigInteger(StringBuffer str){
		data = new StringBuffer(str);
	}

	public int length(){
		return data.length();
	}
	public String toString(){
		return data.toString();
	}
	
	public boolean equals(Object obj){
		return data == ((MyBigInteger)obj).data;
	}
	
	/**
	 * 功能:进行两个非负整数的相加
	 */
	private  StringBuffer plusAdd(String strNum1,String strNum2){
		//把两个数字字符串倒置,并存入字符数组
		char [] num1 = new StringBuffer(strNum1).reverse().toString().toCharArray();
		char [] num2 = new StringBuffer(strNum2).reverse().toString().toCharArray();
		int maxLength = Math.max(num1.length,num2.length);
		int minLength = Math.min(num1.length,num2.length);
		//n位和m位的非负整数相加的和,要么是max(n,m)位,要么是max(n,m)+1位。
		StringBuffer value = new StringBuffer();
	
		/*--------------计算和数开始------------------------*/
		int i,jinWei=0;
		for(i=0;i<minLength;i++){
			int temp = jinWei + num1[i] - '0'  +num2[i] - '0';
			value.append((char)(temp%10 + '0')); 
			jinWei = temp/10;
		}
		if(maxLength == num1.length)
			jinWei = oneBitAdd(jinWei,num1,i,maxLength,value);
		else
			jinWei = oneBitAdd(jinWei,num2,i,maxLength,value);
		if(jinWei != 0)
			 value.append((char)(jinWei +'0'));
		/*--------------计算和数结束------------------------*/
		return deleteZero(value).reverse();
	}
	/**
	 * 进位加上字符数组一部分
	 * @return
	 */
	private int oneBitAdd(int jinWei,char []array,int beginIndex,int endIndex,StringBuffer value){
		int temp;
		for(int i = beginIndex;i<endIndex;i++){
			temp = jinWei + array[i] - '0';
			jinWei = temp/10;
			value.append((char)(temp%10+'0'));
		}
		return jinWei;
	}
	
	/**
	 * 功能:较大的非负整数bigNumStr减去较小的非负整数smallNumStr
	 */
	private  StringBuffer plusMinus(String bigNumStr,String smallNumStr){
		//把两个数字字符串倒置,并存入字符数组
		char [] num1 = new StringBuffer(bigNumStr).reverse().toString().toCharArray();
		char [] num2 = new StringBuffer(smallNumStr).reverse().toString().toCharArray();
		StringBuffer value = new StringBuffer();
		
		/*--------------计算减法开始------------------------*/	
		int i,temp,jieWei = 0;
		for(i = 0;i<smallNumStr.length();i++){
			temp = num1[i]  - jieWei - num2[i];
			jieWei = oneBitMinus(temp,value,i);	
		}
		//处理较大数比较小数多出来的位
		for(;i<bigNumStr.length();i++){
			temp = num1[i] - '0' - jieWei;
			jieWei = oneBitMinus(temp,value,i);
		}
		/*--------------计算减法结束------------------------*/
		return deleteZero(value).reverse();
	}
	/**
	 * 删去多余的0
	 */
	private StringBuffer deleteZero(StringBuffer str){
		int num=0;
		for(int i = str.length()-1;i>=0;i--){
			if(str.charAt(i) == '0')
				num++;
			else
				break;
		}
		if(num != str.length()) 
			str.setLength(str.length()-num);
		else
			str = new StringBuffer("0");
		return str;
	}
	/**
	 * 一位减法
	 */
	private int oneBitMinus(int flag,StringBuffer value,int num){
		int jieWei;
		if(flag <0){
			value.append((char)(10 +flag + '0'));
			jieWei = 1;
		}
		else{
			jieWei = 0;
			value.append((char)(flag + '0'));
		}
		return jieWei;
	}
	
	/**
	 * 名称:内部调用的减法。
	 * 功能:两个非负数相减。
	 * 结果:返回运算结果的前后倒置。
	 */
	private  StringBuffer innerMinus(String str1,String str2){
		StringBuffer temp;
		if(Str1ThanStr2(str1,str2))//若str1更大
			temp =  plusMinus(str1,str2);
		else{
			temp = plusMinus(str2,str1);
			if(!temp.toString().equals("0"))
				 temp.reverse().append('-').reverse();
		}
		return temp;
	}
	/**
	 * 判断正负
	 * true -- 非负      false -- 负
	 */
	public boolean isNoNegative(MyBigInteger t){
		if(t.data.charAt(0) == '-')
			return false;
		return true;
	}
	
	/**
	 * 对外开放的加法接口
	 * 计算str1 + str2
	 */
	public MyBigInteger Add(MyBigInteger str){
		//两数都非负
		if(isNoNegative(this) && isNoNegative(str)) 
			    data = plusAdd(data.toString(),str.data.toString());
		else if(!isNoNegative(this) && !isNoNegative(str)){
				StringBuffer temp = plusAdd(data.substring(1),str.data.substring(1));
				if(!temp.toString().equals("0"))
					data =  temp.reverse().append('-').reverse();
				else
					data = temp;
			}
		else if(!isNoNegative(this) && isNoNegative(str))
				data = innerMinus(str.data.toString(),data.substring(1));
		else
				data = innerMinus(data.toString(),str.data.substring(1));
		return this;
	}
	/**
	 * 对外开放的减法。
	 * 计算str1 - str2
	 */
	public MyBigInteger Minus(MyBigInteger t){
		    //两数都为正。
			if(isNoNegative(this) && isNoNegative(t))
				data = innerMinus(this.data.toString(),t.data.toString());	
			//两数都为负时,需要对innerMinus得到的结果逆转正负。
			else if(!isNoNegative(this) && !isNoNegative(t))  
				data = innerMinus(t.data.substring(1),data.substring(1));		
			//this 为负,t为非负。
			else if(!isNoNegative(this) && isNoNegative(t)){
				StringBuffer temp = plusAdd(data.substring(1),t.data.toString());
				if(!temp.toString().equals("0"))	
					data = temp.reverse().append('-').reverse();
				else
					data = temp;
			}
			//this 为非负,str为负。
			else
				data = plusAdd(data.toString(),t.data.substring(1).toString());	
			return this;
	}
	
	/**
	 * 内部使用的两个正整数乘法
	 */
	private  StringBuffer plusMulti(StringBuffer str1,StringBuffer str2) {
		//新建两个StringBuffer,存储两数的前后倒置。
		StringBuffer num1 = new StringBuffer(str1.substring(0)).reverse();
		StringBuffer num2 = new StringBuffer(str2.substring(0)).reverse();
		StringBuffer array = new StringBuffer();
		//n位数和m位数相乘,得到的结果的位数只能是n+m或者n+m-1。
		int len = str1.length() + str2.length();
		for(int i = 0;i<len-1;i++){
			array.append('0');
		}
		//标志n+m位
		array.append('+'); 
		
		//模拟竖式计算	
		for(int i = 0,j,jinWei = 0 ; i < str2.length() ; i++){
			jinWei = 0; //进位归位
			for(j = 0 ; j < str1.length() ; j++){
				int temp = (num2.charAt(i)-'0')*(num1.charAt(j)-'0') + jinWei + array.charAt(i+j) - '0';
				array.setCharAt(i+j,(char)(temp%10 + '0'));
				jinWei = temp /10;
			}
			if(jinWei !=0)
				array.setCharAt(i+j, (char)(jinWei +'0'));
		}
		if(array.charAt(len -1) == '+')
			array.setLength(len-1);
		return  array.reverse();
	}
	/**
	 * 对外开放的乘法
	 */
	public MyBigInteger Multi(MyBigInteger t){
		//两数至少有一个为0
		if(data.toString().equals("0") || t.data.toString().equals("0"))
			data = new StringBuffer("0");
		else{
			//两数都是正数
			if(isNoNegative(this) && isNoNegative(t))
				data = plusMulti(data,t.data).reverse();
			//两数都是负数
			else if(!isNoNegative(this) && !isNoNegative(t))
				data = plusMulti(new StringBuffer(data.substring(1)),new StringBuffer(t.data.substring(1)));	
			
			//两数一正一负
			else if(isNoNegative(this) && !isNoNegative(t))
				data = 	plusMulti(data,new StringBuffer(t.data.substring(1))).reverse().append('-').reverse();	
			else
				data = plusMulti(new StringBuffer(data.substring(1)),t.data).reverse().append('-').reverse();
		}
		return this;
	}
	/**
	 * 两个非负数相除,除数不为0
	 * 返回:没有前后倒置的正确的结果
	 */
	private StringBuffer plusDivide(String str1,String str2){
		StringBuffer division = new StringBuffer();
		StringBuffer remain   = new StringBuffer();
		
		int end = 0;
		boolean  flag = false;
		while(end < str1.length()){
			remain.append(str1.charAt(end));
			if(Str1ThanStr2(remain.toString(),str2)){//能整除
				flag = true;
				int fullNum = Greatst(remain,str2);
				StringBuffer fullNumStr2 = plusMulti(new StringBuffer(str2),new StringBuffer(""+fullNum));
				division.append(""+fullNum);
				remain = plusMinus(remain.toString(),fullNumStr2.toString());
			}
			else if(flag)//不够除,补0
				division.append("0");
			if(remain.toString().equals("0"))
				remain.setLength(0);
			end++;
		}
		if(division.length() == 0){
			return division.append('0');
		}
		return division;
	}
	/**
	 * 对外开放的减法
	 */
	public MyBigInteger Divide(MyBigInteger t){
		if(t.data.toString().equals("0"))
			System.out.println("除零异常");
		else{
			if(isNoNegative(this) && isNoNegative(t))
				data = plusDivide(data.toString(),t.data.toString());
			else if(!isNoNegative(this) && !isNoNegative(t)){
				data = plusDivide(data.substring(1),t.data.substring(1));
			}
			else{
				StringBuffer temp;
				if(!isNoNegative(this) && isNoNegative(t))
					 temp = plusDivide(data.substring(1),t.data.toString());
				else
					 temp = plusDivide(data.toString(),t.data.substring(1));
				if(temp.toString().equals("0"))
					data = temp;
				else
					data = temp.reverse().append('-').reverse();
			}
		}
		return this;
	}

	/*
	 * 找出最大
	 */
	private  int Greatst(StringBuffer str1,String str2){
		for(int i = 1;i<10;i++){
			StringBuffer num2 = new StringBuffer(str2);
			for(int j =0;j<i;j++){//(i +1)倍
				num2 = plusAdd(num2.toString(),str2);
			}
			if(!Str1ThanStr2(str1.toString(),num2.toString())){
				return i;
			}
		}
		return -1;
	}
	/**
	 * 判断str1、str2的大小
	 * 返回:str1>= str2 -----true           
	 *      str1< str2 -----false
	 */
	private static boolean Str1ThanStr2(String str1,String str2){
		boolean flag;//1 代表str1大些;2代表str2大些
		//判断两个非负数,谁大。
		if(str1.length() == str2.length()){
			if(str1.compareTo(str2)<0)
				flag = false;
			else   
				flag =true;
		}
		else{
			if(str1.length() >str2.length())
				flag = true;
			else
				flag = false;
		}
		return flag;
	}
	
	
	public static void main(String[] args) {
		MyBigInteger a1 = new MyBigInteger("175");
		MyBigInteger a2 = new MyBigInteger("231");
		MyBigInteger a3 = new MyBigInteger("143");
		MyBigInteger a4 = new MyBigInteger("-1978654");
		MyBigInteger b = new MyBigInteger("-54");
		MyBigInteger b1 = new MyBigInteger("0");
		//175 + 231 - 143
		System.out.println(a1.Add(a2).Minus(a3));
		//(175 + 231 - 143)*(-1978654)
		System.out.println(a1.Multi(a4));
		//(175 + 231 - 143)*(-1978654)/(-54)
		System.out.println(a1.Divide(b));
		//0
		System.out.println(a1.Multi(b1));
	}
}

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值