代码实现超过long长度的数字乘法运算[Java代码]

写完之后百度了一下我哭了,因为这种方法Java官方Api就可以实现,而且使用很方便很强大……
Q:为什么要写这个?
A:昨天晚上失眠,睡不着忽然想到这个问题,然后思考了一下写法,今天下午摸鱼写了出来。

注:使用Java的BigInteger类可以实现大数字的处理运算,具体可以参考这篇博客博客地址

我的思路是这样的,一个乘法运算可以分解为多次的加法运算来进行处理,比如:

  • 5 * 3 = 5 + 5 + 5 = 10 + 5 = 15
    所以我在代码中先使用一个循环,循环的因子是乘法运算中的两个数字中的较小的一个(因为这样可以提升一些效率),然后使这个因子每次都减一,没减一一次,就把另外一个较大的数字自身与sum相加。

伪代码:

	乘数0 与乘数1,乘数0  < 乘数1
	sum = 0;
	while 乘数0 != 0
		乘数0--;
		sum += 乘数1;

当然由于计算的都是超过long大小的数字,所以这些乘数和sum在代码中都是通过String来修饰的。
代码如下:

	
public class GetLongNumSum {

	private String numString1;
	private String numString2;
	private boolean isNegative = false;
	
	public GetLongNumSum(String numString1, String numString2) {
		// TODO Auto-generated constructor stub
		
		//判断数据长度>0
		if (numString1 == null || numString2 == null || 
				numString1.length() < 1 || numString2.length() < 1) {
			System.out.println("传入的参数有错误");
			return;
		}
		
		//判断结果是否是负数,修改字符串内容(去掉负号)
		if (numString1.startsWith("-")) {
			isNegative = !isNegative;
			numString1 = numString1.substring(1, numString1.length());
		}
		if (numString2.startsWith("-")) {
			isNegative = !isNegative;
			numString2 = numString2.substring(1, numString2.length());
		}
		
		//判断数据是否全为数字,
		if (!isAllNumber(numString1) || !isAllNumber(numString2)) {
			System.out.println("传入的参数有错误");
			return;
		}
		
		//将字符串前面的0去掉
		numString1 = deleteBufZero(numString1);
		numString2 = deleteBufZero(numString2);
		
		//数据正常,开始进行运算
		this.numString1 = numString1;
		this.numString2 = numString2;
		showMulResult();
	}
	
	//运算的Main方法
	private void showMulResult() {

		String numString1Temp;//保存比较大的那个乘数
		String numString2Temp;//保存比较小的那个乘数
		
		if (numString1.length() > numString2.length()) {
			numString1Temp = numString1;
			numString2Temp = numString2;
		} else {
			numString1Temp = numString2;
			numString2Temp = numString1;
		}
		String sum = numString1Temp;
		
		//这儿的核心是把乘法进行分解,分解成多次的加法进行运算,比如5*3 = 5 + 5 + 5 = 10 + 5 = 15
		System.out.println("开始时间: " + System.currentTimeMillis());
		if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '0') {//一个乘数为0直接结果为0
			sum = "0";
		} else if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '1') {//一个乘数为1直接结果为1
			sum = numString1Temp;
		} else {
			numString2Temp = deleteNumber(numString2Temp);//先进行一次乘数--,避免最终结果多加了一遍的问题
			while(!isAllNumber0(numString2Temp)) {//是否为0
				numString2Temp = deleteNumber(numString2Temp);//--运算
				sum = numberSum(sum, numString1Temp);//求和运算
			}
		}
		System.out.println("计算结果: " + sum);
		System.out.println("结束时间: " + System.currentTimeMillis());
	}
	
	//加法运算
	private String numberSum(String buf1, String buf2) {
		int buf1Length = buf1.length();
		int buf2Length = buf2.length();
		int tMinLength = Math.min(buf1Length, buf2Length);
		String Sum = "";
		boolean isCarry = false;//上一次的运算是否存在进位
		for (int i = 0; i < tMinLength; i++) {
			char c1 = buf1.charAt(buf1Length - i - 1);
			char c2 = buf2.charAt(buf2Length - i - 1);
			int num1 = c1 - '0';
			int num2 = c2 - '0';
			int isCarryTemp = 0;
			if (isCarry) {//如果上次存在进位
				isCarryTemp = 1;
				Sum = Sum.substring(1, Sum.length());
			}
			int num3 = (num1 + num2 + isCarryTemp)%10;//个位
			if (num1 + num2 + isCarryTemp >= 10) {
				Sum = "1" + num3 + Sum;
				isCarry = true;
			} else {
				Sum = num3 + Sum;
				isCarry = false;
			}
		}
		if (buf1Length < buf2Length) {
			buf2 = buf2.substring(0, buf2Length-buf1Length);
		} else {
			buf2 = buf1.substring(0, buf1Length-buf2Length);
		}
		if (isCarry) {
			int buf2LengthTemp = buf2.length();
			int i;
			for (i = 0; i < buf2LengthTemp; i++) {
				char c = buf2.charAt(buf2LengthTemp - i - 1);
				int tempNum = c - '0' + 1;
				if (tempNum > 9) {
					buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 + 
							buf2.substring(buf2LengthTemp - i, buf2LengthTemp);
				} else {
					buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 + 
							buf2.substring(buf2LengthTemp - i, buf2LengthTemp);
					break;
				}
			}
			if (i == buf2LengthTemp) {
				buf2 = "1" + buf2;
			}
			Sum = Sum.substring(1, Sum.length());
		}
		Sum = buf2 + Sum;
		return Sum;
	}
	
	//将字符串数字减1
	private String deleteNumber(String buf) {
		boolean lendNumFlag = false;
		String bufTemp = buf;
		int i;
		for (i = buf.length()-1; i >= 0; i--) {
			int num = buf.charAt(i) - '0' - 1;
			buf = buf.substring(0, i) + ((num+10)%10) + buf.substring(i+1, buf.length());
			if (num >= 0) {
				break;
			}
		}
		return buf;
	}
	
	//去掉字符串前面的0
	private String deleteBufZero(String buf) {
		for (int i = 0; i < buf.length(); ) {
			if (buf.length() < 2) {
				break;
			}
			if (buf.charAt(i) == '0') {
				buf = buf.substring(1, buf.length());
			} else {
				break;
			}
		}
		return buf;
	}
	
	//判断字符串是否全为0
	private boolean isAllNumber0(String buf) {
		for (int i = 0; i < buf.length(); i++) {
			if (buf.charAt(i) != '0') {
				return false;
			}
		}
		return true;
	}
	
	//判断字符串是否全为数字
	private boolean isAllNumber(String buf) {
		String reg = "^\\d+$";
		return buf.matches(reg);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值