Java 大数加减乘(无除),不含小数点

package com.algorithm;

public class BigIntegerOpeator {

	
	public static void main(String[] args) {
		
		String a = "1231313432";
		String b = "12312376";
		
		String result = add(a, b);
		System.out.println(a + " + " + b + " = " + result);
		
		String c = "1234";
		String d = "5678";
		
		System.out.println(c + " - " + d + " = " + sub(c, d));
		
		String e = "1234";
		String f = "1";
		System.out.println(e + " * " + f + " = " + multi(e, f));
	}

	private static String multi(String e, String f) {
		return multi(e.toCharArray(), f.toCharArray());
	}

	/**
	* @Author:yangwl 
	* @date 2015年12月22日 下午4:15:36 
	* @param charArray
	* @param charArray2
	* @return 
	* @throws 
	* @Description: //大整数相乘
	* 				//简单乘法+大整数加法
	 */
	private static String multi(char[] a, char[] b) {
		int b_index = b.length;
		char [] result = new char[a.length + b.length + 1];
		int index = result.length;
		init(result);
		
		//首先初始化result数组
		char [] t = subMulti(a, b[--b_index]);
		for(int i = t.length-1; i >= 0; i--) {
			result[--index] = t[i];
		}
		index = result.length;
		
		int f = 1;
		while(--b_index >= 0) {
			
			char [] t1 = clearZero(result);
			char [] t2 = subMulti(a, b[b_index]);
			t2 = (new String(t2) + getZero(f)).toCharArray();
			if(null == t1) {
				t1 = result;
			}
			char[] t3 = add(t1, t2).toCharArray();
			
			int l = result.length;
			for(int i = t3.length-1; i >= 0; i--) {
				result[--l] = t3[i];
			}
			f++;
		}
		replace(result);
		return new String(result).replace("_","");
	}

	private static void replace(char[] result) {
		for(int i = 0; i < result.length; i++) {
			if(result[i] == '0') {
				result[i] = '_';
			} else {
				break;
			}
		}
	}

	private static String getZero(int f) {
		String s="";
		for(int i = 0; i < f; i++) {
			s += "0";
		}
		return s;
	}

	private static char[] clearZero(char[] result) {
		for(int i = 0; i < result.length; i++) {
			if(result[i] != '0') {
				return new String(result, i, result.length - i).toCharArray();
			}
		}
		return null;
	}

	private static char[] subMulti(char[] a, char c) {
		char [] result = new char[a.length+1];
		init(result);
		int index = result.length;
		int a_index = a.length;
		while(--a_index >= 0 && --index >= 0) {
			int r = parseToInt(a[a_index]) * parseToInt(c);
			result[index] = parseToChar(parseToInt(result[index]) + r % 10);
			if(r >= 10) {
				result[index-1] = parseToChar(parseToInt(result[index-1]) + r / 10);
			}
		}
		return (result[0] == '0' ?  new String(result,1,result.length-1) : new String(result)).toCharArray();
	}

	/*********************************************************************************************************************************************************************/
	
	
	
	
	private static String sub(String a, String b) {
		return sub(a.toCharArray(), b.toCharArray());
	}

	/**
	* @Author:yangwl 
	* @date 2015年12月22日 下午1:10:11 
	* @param charArray
	* @param charArray2
	* @return 
	* @throws 
	* @Description: //两个数做减法
	 */
	private static String sub(char[] a, char[] b) {
		int index = 0;
		boolean flag = true;
		if (a.length > b.length){
			index = a.length;
		}
		if (b.length > a.length) {
			index = b.length;
			flag = false;
		}
		if (a.length == b.length) {
			index = a.length;
			for(int i = 0; i < index; i++) {
				if(parseToInt(a[i]) > parseToInt(b[i])) {
					break;
				}
				if(parseToInt(b[i]) > parseToInt(a[i])) {
					flag = false;
					break;
				}
				if(parseToInt(b[i]) == parseToInt(a[i])) {
					if(i+1 == index) return parseToChar(0)+"";
					continue;
				}
			}
			
			
		}
		char [] result;
		if(!flag) {
			result = a;
			a = b;
			b = result;
		} 
		result = new char[index];
		int a_index = a.length-1;
		int b_index = b.length-1;
		index--;
		while(index != -1) {
			int a_value = 10;
			if(a_index > -1) {
				a_value = parseToInt(a[a_index]);;
			}
			int sub = a_value;
			if(b_index > -1) {
				if(10 == sub) {
					System.out.println("执行出错.");
					return "";
				};
				int b_value =  parseToInt(b[b_index--]);
				if(a_value >= b_value) {
					sub = a_value - b_value;
				} else {
					//首先借1
					a[a_index-1] = parseToChar(parseToInt(a[a_index-1]) - 1 + 48);
					sub = a_value + 10 - b_value;
				}
			}
			a_index --;
			result[index--] = parseToChar(sub);
		}
		if(result[0] == '0') {
			if(flag) {
				return new String(result,1,result.length-1);
			} else {
				result[0] = '-';
				return new String(result);
			}
		} else {
			if(flag) {
				return new String(result);
			} else {
				return "-"+new String(result);
			}
		}
	}

	private static String add(String a, String b) {
		return add(a.toCharArray(), b.toCharArray());
	}

	/**
	* @Author:yangwl 
	* @date 2015年12月21日 下午2:20:08 
	* @param a
	* @param b
	* @return 
	* @throws 
	* @Description: //TODO
	 */
	private static String add(char[] a, char[] b) {
		int index = a.length > b.length ? a.length + 1 : b.length + 1;
		char [] result = new char[index];
		init(result);
		int a_index = a.length;
		int b_index = b.length;
		
		int i = 0;
		
		while(i < index) {
			int temp = 0;
			if(--a_index >= 0) {
				temp = (int)a[a_index] - 48;
			}
			if(--b_index >= 0) {
				temp += (int)b[b_index] - 48;
			}
			result[--index] =(char) ((int)(result[index]-48) + temp % 10 + 48);
			if(temp / 10 == 1) {
				result[index - 1] = '1'; 
			}
		}
		return result[0] == '1' ? new String(result) : new String(result,1,result.length-1);
	}

	private static void init(char[] result) {
		for(int i = 0; i < result.length; i++) {
			result[i] = '0';
		}
	}

	public static int parseToInt(char c) {
		return (int)c - 48;
	}
	
	public static char parseToChar(int a) {
		return (char)(a + 48);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值