使用String模拟大数加减乘除(除法和取余待补充)

加减:模拟手工计算过程。

乘:模拟手工计算过程(乘数B的每一位数字和乘数A相乘的时候使用连续n次加法进行模拟)

除:连续做减法,直到差值出现负号

(注:代码未经过充分测试,重点是记录下思想)

 

Java代码如下:

 

import java.math.BigInteger;

public class Solution {
	// 将string转化为指定的长度
	public static String castSame(String input, int len) {
		if (input.length() > len) {
			return null;
		}
		StringBuilder result = new StringBuilder(input);
		int subLength = len - input.length();
		for (int i = 0; i < subLength; i++) {
			result.insert(0, 0);
		}
		return result.toString();
	}

	// 去掉最前面的无效的0(参数必须为正数)
	public static String removeZero(String input){
		int length = input.length();
		int i = 0;
		for(; i<length; i++){
			int current = Integer.parseInt(input.charAt(i)+"");
			if(current != 0){
				break;
			}
		}
		if(i == length){
			return "0";
		} else {
			return input.substring(i);
		}
	}
	
	// 判断两个参数谁更小(输入的两个参数必须都为正数)
	public static boolean isSmall(String num1, String num2){
		if(num1.length() < num2.length()){
			return true;
		} else if(num1.length() > num2.length()){
			return false;
		}
		// 两个数 总位数一样
		int index = 0;
		
		while(index < num1.length()){
			int num1Temp = Integer.parseInt(num1.charAt(index)+"");
			int num2Temp = Integer.parseInt(num2.charAt(index)+"");
			if(num1Temp < num2Temp){
				return true;
			} else if(num1Temp > num2Temp){
				return false;
			}
			index ++;
		}
		return false;
	}
	
	
	// 使用string模拟大数减法
	public static String sub(String num1, String num2) {
		// 标识结果是否为负
		boolean isNeg = false;
		StringBuilder result = new StringBuilder();
		// 处理 负号
		if (num1.contains("-") && !num2.contains("-")) {
			num1 = num1.replace("-", "");
			result.append(add(num1, num2));
			return "-" + result.toString();
		} else if (num1.contains("-") && num2.contains("-")) {
			num2 = num2.replace("-", "");
			num1 = num1.replace("-", "");
			return sub(num2, num1);
		} else if (!num1.contains("-") && num2.contains("-")) {
			return add(num1, num2);
		}
		// 判断两个数谁更大,使用大的减小的
		if(isSmall(num1, num2)){
			// 交换二者的值
			String temp = num1;
			num1 = num2;
			num2 = temp;
			isNeg = true;
		} 
		// 两个正数相减
		if(num1.length() < num2.length()){
			num1 = castSame(num1, num2.length());
		} else if(num1.length() > num2.length()){
			num2 = castSame(num2, num1.length());
		}
		
		int index = num1.length() - 1;
		int res = 0;
		// 借位标识
		int borrow = 0;
		while(index >= 0){
			int num1Int = Integer.parseInt(num1.charAt(index) + "");
			int num2Int = Integer.parseInt(num2.charAt(index) + "");
			if((num1Int - borrow) < num2Int){
				res = 10 + num1Int - borrow - num2Int;
				borrow = 1;
			} else{
				res = num1Int - borrow - num2Int;
				borrow = 0;
			}
			result.append(res);
			index --;
		}

		// 去掉前面的无效的0
		String resultStr = "";
		if(isNeg){
			resultStr = removeZero(result.reverse().toString());
			resultStr = "-" + resultStr;
		} else {
			resultStr = removeZero(result.reverse().toString());
		}
		return resultStr;
	}

	
	// 使用string模拟大数加法
	public static String add(String num1, String num2) {
		StringBuilder result = new StringBuilder();
		// 标识结果是否为负
		boolean isNeg = false;
		// 处理符号
		if (num1.contains("-") && num2.contains("-")) {
			num1 = num1.replace("-", "");
			num2 = num2.replace("-", "");
			isNeg = true;
		} else if (num1.contains("-") && !num2.contains("-")) {
			num1 = num1.replace("-", "");
			return sub(num2, num1);
		} else if (!num1.contains("-") && num2.contains("-")) {
			num2 = num2.replace("-", "");
			return sub(num1, num2);
		}
		// 将两个加数处理成长度相同的字符串,长度不够,使用0填充
		if (num1.length() > num2.length()) {
			num2 = castSame(num2, num1.length());
		} else if (num1.length() < num2.length()) {
			num1 = castSame(num1, num2.length());
		}

		int length = num1.length();
		int index = length - 1;
		// 进位标识
		int add = 0;
		// 当前位的结果
		int res = 0;
		int sum = 0;
		int num1Int;
		int num2Int;
		while (index >= 0) {
			num1Int = Integer.parseInt(num1.charAt(index) + "");
			num2Int = Integer.parseInt(num2.charAt(index) + "");
			sum = num1Int + num2Int + add;
			add = sum / 10;
			res = sum % 10;
			result.append(res);
			index--;
		}
		// 处理最后一个进位
		if (add == 1) {
			result.append(1);
		}
		String resultStr = removeZero(result.reverse().toString());
		if(isNeg){
			resultStr = "-" + resultStr;
		}
		return resultStr;
	}

	
	// 使用string模拟大数乘法
	public static String multi(String num1, String num2){
		// 正负号标记
		boolean isNeg = false;
		// 判断符号
		if(num1.contains("-") && !num2.contains("-")){
			isNeg = true;
			num1 = num1.replace("-", "");
		}else if(!num1.contains("-")&& num2.contains("-")){
			isNeg = true;
			num2 = num2.replace("-", "");
		} else if(num1.contains("-") && num2.contains("-")){
			num1 = num1.replaceAll("-", "");
			num2 = num2.replace("-", "");
		}
		
		// 计算两个正数的乘法
		if(isSmall(num1, num2)){
			String temp = num1;
			num1 = num2;
			num2 = temp;
		}
		StringBuilder sumBuilder = new StringBuilder();
		String sum = "0";
		String sumTemp = "0";
		int index = 0;
		for(int i=num2.length()-1; i>=0; i--){
			int current = num2.charAt(i) - '0';
			sumTemp = "0";
			// 循环做n次加法,就相当于乘上了n
			for(int j=0; j<current; j++){
				sumTemp = add(num1, sumTemp);
			}
			sumBuilder = new StringBuilder(sumTemp);
			// 中间结果向左移动几位
			for(int k=0; k<index; k++){
				sumBuilder.append("0");
			}
			index ++;
			sum = add(sum, sumBuilder.toString());
		}
		if(isNeg){
			return "-" + sum;
		} else{
			return sum;
		}
	}
	
	
	// 大数相除(待补充...):连续做减法,直到差值出现负号
	
	// 大数取余(待补充...)
	// 参考链接:http://www.cnblogs.com/asongaaa/p/3892873.html
	
	
	public static void main(String[] args) throws Exception {
		BigInteger integer = new BigInteger("-332345235");
		System.out.println(integer.add(new BigInteger("1335")));
		System.out.println(Solution.add("-332345235", "1335"));
		System.out.println();
		
		integer = new BigInteger("-332345235");
		System.out.println(integer.add(new BigInteger("-13313240235")));
		System.out.println(Solution.add("-332345235", "-13313240235"));
		System.out.println();
		
		System.out.println(Solution.add("0","0"));
		
		integer = new BigInteger("-332345235");
		System.out.println(integer.subtract(new BigInteger("1335")));
		System.out.println(Solution.sub("-332345235", "1335"));
		System.out.println(Solution.sub("-3325", "32355"));
		
		
		integer = new BigInteger("-332345235");
		System.out.println(integer.multiply(new BigInteger("-133234545")));
		System.out.println(Solution.multi("-332345235", "-133234545"));
	}
}

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值