(算法)字符串相乘————<字符串—模拟>

1. 题⽬链接:43.字符串相乘

2. 题⽬描述:

3. 解法(⽆进位相乘然后相加,最后处理进位):

算法思路:

整体思路就是模拟我们⼩学列竖式计算两个数相乘的过程。但是为了我们书写代码的⽅便性,我们选 择⼀种优化版本的,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去 考虑进位。

如下图:  

 C++算法代码:

class Solution 
{
public:
    string multiply(string num1, string num2) 
    {
        //翻转
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());
        //不处理进位存储
        int m=num1.size(),n=num2.size();
        vector<int>temp(m+n,0);
        for(int i=0;i<num2.size();i++)
        {
            for(int j=0;j<num1.size();j++)
            {
                temp[i+j]+=(num2[i]-'0')*(num1[j]-'0');
            }
        }
        //处理进位
        string answer;
        int jinwei=0;
        for(int i=0;i<m+n;i++)
        {
            answer+=to_string((temp[i]+jinwei)%10);
            jinwei+=temp[i];
            jinwei/=10;
        }
        //  处理前导零
        //结果不为0,但尾部有0就尾删 
        while(answer.size() > 1 && answer.back() == '0') 
        {
            answer.pop_back();
        }
        reverse(answer.begin(),answer.end());
        return answer;
    }
};

Java算法代码:

class Solution
{
	public String multiply(String num1, String num2)
	{
		int m = num1.length(), n = num2.length();
		char[] n1 = new StringBuffer(num1).reverse().toString().toCharArray();
		char[] n2 = new StringBuffer(num2).reverse().toString().toCharArray();
		int[] tmp = new int[m + n - 1];
		// 1. ⽆进位相乘后相加 
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');

		// 2. 处理进位 
		int cur = 0, t = 0;
		StringBuffer ret = new StringBuffer();
		while (cur < m + n - 1 || t != 0)
		{
			if (cur < m + n - 1) t += tmp[cur++];
			ret.append((char)(t % 10 + '0'));
			t /= 10;
		}
		// 3. 处理进位 
		while (ret.length() > 1 && ret.charAt(ret.length() - 1) == '0')
			ret.deleteCharAt((ret.length() - 1));
		return ret.reverse().toString();
	}
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

课堂随笔

感谢支持~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值