LeetCode-----第四十三题-----字符串相乘

字符串相乘

难度:中等

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

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

 

题目分析:

       直接按照竖式乘法的形式想成,相加就完事了。主要是要考虑转换成int型。程序都有注释

 

参考代码:

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <deque>
#include <stack>
#include <algorithm>
#include <map>

using namespace std;

//主要是将字符串转换成数字,但是只转换一个数字(全部转换的话必定会溢出int)
class Solution {
public:
	string multiply(string num1, string num2) {
		bool flag = true;
		string res;
		//如果其中一个数为0,那么不需要乘,直接返回0
		if (num1[0] == '0' || num2[0] == '0')
			return "0";
		//需要考虑符号
		if (num1[0] == '-' && num2[0] != '-' ||
			num1[0] != '-' && num2[0] == '-')
			flag = false;

		string temp;  //因为相乘之后的存储是方向的,所以弄一个temp
		int mult_num1;//num1中的某一位数
		int mult_num2;//num2中的某一位数
		int carry = 0;//乘法进位
		int z = 0;    //结果中从第z位开始相加
		temp.resize(num1.size() + num2.size());//初始化内存
		for (int i = num1.size()-1; i >= 0; --i)
		{
			//考虑符号情况就直接返回了
			if (num1[i] == '-')
				break;
			mult_num1 = num1[i] - '0'; //转换num1中的某一位数
			z = num1.size() - 1 - i;   //temp是从左到右存储的
			for (int j = num2.size() - 1; j >= 0; --j)
			{
				//考虑符号情况就直接返回了
				if (num2[j] == '-')
					break;
				
				mult_num2 = num2[j] - '0';		//转换num2中的某一位数
				carry += mult_num1 * mult_num2; //carry累加一下乘法结果(又是进位,又是积和)
				int temp_carry = carry % 10;    //相加的时候也要考虑进位的问题(carry中的个位)
				int temp_z;                     //原来和中对应的那一位
				if (temp[z] != '\0')
					 temp_z = temp[z] - '0';	//不为空的话,就转换成int型的数,以便相加
				else
					 temp_z = 0;                //为空的话,说明是第一次,为0
				int sum = temp_carry + temp_z;  //求出相加的和
				temp[z] = sum % 10 + '0';       //先放入个位
				carry /= 10;					//删掉个位
				carry += sum / 10;				//留下十位,是进位
				++z;                            //记得z++,从下一位开始相加
			}
			//计算到最后,如果carry不为0,那就在转换成字符加入字符串
			if (carry != 0)
			{
				temp[z] = carry % 10 + '0';
				carry = 0;
			}
			
		}
		//判断是否要添加符号
		if (!flag)
			res.push_back('-');
		//从后往前存储就完事了
		for (int k = temp.size()-1; k >= 0; --k)
		{
			//要注意的是如果有符号,最后两位可能是‘\0’
			if (temp[k] != '\0')
				res.push_back(temp[k]);
		}
		return res;
	}
};
int main()
{
	Solution solution;
	string num1 = "-56789019";
	string num2 = "0";
	cout << solution.multiply(num1, num2) << endl;

	system("pause");
	return 0;
}

 

参考代码:(上面考虑了符号)

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1[0] == '0' || num2[0] == '0')
            return "0";
        
        string res(max(num1.size()*num2.size(),num1.size()+num2.size()),'0');

        int w_index = -1;
        int temp = 0;
        for(int i = num2.size()-1; i >= 0; i--)
        {
            w_index = num2.size()- 1 - i;
            for(int j = num1.size() - 1; j >= 0; j--)
            {
                int data1 = num1[j] - '0';
                int data2 = num2[i] - '0';
                temp += data1*data2;

                temp += (res[w_index] - '0');
                res[w_index] = temp%10 + '0';

                temp /= 10;
                w_index++;
            }
            if(temp != 0)
            {
                res[w_index] = temp + '0';
                temp = 0;
            }
        }
        if(res[w_index] == '0')
            w_index--;
        
        string res_str;
        for(int i = w_index; i >= 0; i--)
        {
            res_str.push_back(res[i]);
        }
        return res_str;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值