字符串相乘

9 篇文章 0 订阅
2 篇文章 0 订阅

字符串相乘

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

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”

代码:

class Solution
{
public:
	string addStrings(string num1, string num2)
	{
		int len1 = num1.size();
		int len2 = num2.size();
		if (len1 > len2)
		{
			swap(len1, len2);
			num1.swap(num2);
		}
		string ret;
		ret.reserve(len2 + 2);
		int step = 0;
		int j = len2 - 1;
		for (int i = len1 - 1; j >= 0; i--, j--)
		{
			int sum = 0;
			if (i >= 0)
			{
				sum = (num1[i] - '0' + num2[j] - '0') + step;
			}
			else
				sum = (num2[j] - '0') + step;
			step = 0;
			if (sum > 9)
			{
				step++;
				sum = sum - 10;
			}
			ret.push_back(sum + '0');
		}
		if (step != 0)
		{
			ret.push_back(step + '0');
		}
		reverse(ret.begin(), ret.end());
		return ret;
	}
public:
	string multiply(string num1, string num2)
	{
		int len1 = num1.size();
		int len2 = num2.size();
		string add;
		add.reserve(len1 + len2+1);
		if (num1[0] == '0' || num2[0] == '0')//1
		{
			add.push_back('0');
			return add;
		}
		if (len1 < len2)
		{
			swap(len1, len2);
			num1.swap(num2);
		}
		int j = len1 - 1;
		int step = 0;
		string* ret=new string[len2+1];
		for (int i = 0; i < len2; i++)
		{
			ret[i].reserve(len1 + len2);
		}
		for (int i = 0; i < len2; i++)//2
		{
			for (; j >= 0; j--)
			{
				int sum = 0;
				sum = (num1[j] - '0')*(num2[i] - '0') + step;
				step = 0;
				if (sum > 9)
				{
					step = sum / 10;
					sum = sum % 10;
				}
				ret[i].push_back(sum + '0');
			}
			if (step != 0)
			{
				ret[i].push_back(step + '0');
				step = 0;
			}
			reverse(ret[i].begin(), ret[i].end());
			int count = len2 - 1;
			while (count - i)//3
			{
				ret[i].push_back('0');
				count--;
			}
			j = len1 - 1;
		}
		add = addStrings(ret[0], ret[1]);//4
		for(int i=2;i<len2;i++)
			add= addStrings(add, ret[i]);
		delete[] ret;
		return add;
	}
};

虽然方法很烂,但是还是做出来了哈哈哈。
要注意的几点:
1.要注意两个数相乘,其中一个可能是0,如果没有特别处理,就会输出结果为多个0,比如
,999 * 0=000;不会通过;
2.用两个数中长度短的作为乘数,比如,123 * 45,用45做乘数,用123分别去乘乘数的每一位,得到的结果分别保存下来;
3.乘数有多少个长度,就给第一个结果添长度-1个0,第二个添长度-2个0;以此类推;
比如 123 * 45;
结果保存在ret[0]=“4920”,ret[1]=“615”,把结果相加就好;
4.申请len2+1个长度,避免出现2*3这种情况,如果申请len2个长度结果空间去保存,
这里只有一个结果空间ret[0],ret[1]就不存在,使用add = addStrings(ret[0], ret[1]);就会出错;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值