43. Multiply Strings

给你两个以字符串形式表示的非负整数num1,num2,以字符串的形式返回它们的乘积。

1. 常规思路

使用数组来模拟两个数相乘的计算过程,每一次计算的结果都存放到一个临时数组中,注意计算过程中的

进位问题。

public String multiply(String num1, String num2)
	{
		// 先对num1和num2的情况进行判断
		if (num1 == null || num2 == null)
			return "";
		
		// 判断num1和num2的长度
		if (num2.length() > num1.length())
		{
			// 交换
			String temp = num2;
			num2 = num1;
			num1 = temp;
		}
		
		char[] c1 = num1.toCharArray();
		char[] c2 = num2.toCharArray();
		
		int[] res = new int[c1.length+c2.length];
		int[] tmp = null;
		int k = 0;
		int carry = 0; // 进位
		// c1 * c2
		for (int i=c2.length-1, count=0; i>-1; i--, count++)
		{
			k = res.length - 1 - count;
			tmp = new int[c1.length+c2.length]; // 临时数组,记录每一次相乘的结果
			for (int j=c1.length-1; j>-1; j--)
			{
				int val = (c1[j] - '0') * (c2[i] - '0') + carry;
				if (val >= 10)
				{
					carry = val / 10; 
					val = val % 10;
				}
				else
				{
					carry = 0;  // 置零
				}
				tmp[k--] = val;
			}
			// 内部计算完后,仍然可能有进位,没有处理;如 9 * 9 = 81
			if (carry != 0)
			{
				tmp[k] = carry;
				carry = 0; // 置零
			}
			System.out.println(Arrays.toString(tmp));
			// 求出的结果相加
			add(res, tmp);
			
		}
		return print(res);
	}
	
	public int[] add(int[] val1, int[] val2)
	{
		int i = val1.length-1;
		int carry = 0;
		while (i >= 0)
		{
			int temp = val1[i] + val2[i] + carry;
			if (temp >= 10)
			{
				carry = temp / 10;
				temp = temp % 10;
			}
			else
			{
				carry = 0;
			}
			val1[i] = temp;
			i--;
		}
		return val1;
	}
	
	public String print(int[] val)
	{
		StringBuffer buffer = new StringBuffer();
		int i = 0;
		while (i<val.length && val[i] == 0)
			i++;
		
		// 如果已经到达数组末尾
		if (i == val.length)
		{
			return "0";
		}
		
		// 从前向后遍历,放入到buffer中
		while (i < val.length)
		{
			buffer.append(val[i]);
			i++;
		}
		return buffer.toString();
	}
	

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值