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

 

你可能感兴趣的:(javase)