使用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 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

 

 

 

 

 

 

你可能感兴趣的:(经典算法)