华为面试题目大整数乘法java代码

华为面试题目大整数乘法java代码

package cn.sunline.test;


/**
 * @author huangzhongj
 *
 */
public class BigInt3 {
	public static String multiply(String s1, String s2) {
		int iLengthBefore = s1.length();
		if (s1.length() % 2 != 0) {
			s1 = "0" + s1;
			s2 = "0" + s2;
		}
		if (s1.length() <= 4) {
			int i1 = Integer.valueOf(s1);
			int i2 = Integer.valueOf(s2);
			return i1 * i2 + "";
		}
		String sOneLeft = s1.substring(0, s1.length() / 2);
		String sOneRight = s1.substring(s1.length() / 2);
		String sTwoLeft = s2.substring(0, s1.length() / 2);
		String sTwoRight = s2.substring(s1.length() / 2);
		char[] arrCharHalf = new char[s1.length() / 2];
		char[] arrCharTotal = new char[s1.length()];
		for (int i = 0; i < arrCharTotal.length; i++) {
			if (i > arrCharHalf.length - 1) {
				arrCharTotal[i] = '0';
			} else {
				arrCharTotal[i] = '0';
				arrCharHalf[i] = '0';
			}
		}
		String sRight = multiply(sOneRight, sTwoRight);
		String sCenter1 = multiply(sOneLeft, sTwoRight) + String.valueOf(arrCharHalf);
		String sCenter2 = multiply(sOneRight, sTwoLeft) + String.valueOf(arrCharHalf);
		String sLeft = multiply(sOneLeft, sTwoLeft) + String.valueOf(arrCharTotal);
		String[] arrString = { sRight, sCenter1, sCenter2, sLeft };
		char[] cResult = new char[iLengthBefore * 2];
		for (int i = 0; i < cResult.length; i++) {
			cResult[i] = '0';
		}
		for (String s : arrString) {
			for (int i = 0; i < s.length(); i++) {
				calOneWei(cResult, cResult.length - 1 - i, s.charAt(s.length() - 1 - i));
			}
		}
		return moveZeroChar(cResult);
	}

	public static void main(String[] args) {
		String s1 = "1234567891011121314151617181920";
		String s2 = "2019181716151413121110987654321";
		System.out.println(multiply(s1, s2));
	}

	public static void calOneWei(char[] arr, int iPosition, char cSummand) {
		if (cSummand != '0') {
			arr[iPosition] += cSummand;
			if (arr[iPosition] > 105) {
				arr[iPosition] = (char) (arr[iPosition] - 96 - 10 + 48);
				calOneWei(arr, iPosition - 1, '1');
			} else {
				arr[iPosition] = (char) (arr[iPosition] - 96 + 48);
			}
		}
	}

	public static String moveZeroChar(char[] arrChar) {
		int i;
		for (i = 0; i < arrChar.length; i++) {
			if (arrChar[i] != '0') {
				break;
			}
		}
		if (arrChar[0] == '0') {
			char[] arrCharNew = new char[arrChar.length - i];
			for (int j = i; j < arrChar.length; j++) {
				arrCharNew[j - i] = arrChar[j];
			}
			return String.valueOf(arrCharNew);
		}
		return String.valueOf(arrChar);
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值