Multiply Strings

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

思路:两数字字符串相乘,则必会出现超出整型范围的情况,所以这题我们不能只是单单将这俩个字符串转化为数字直接相乘。

1)定义一个数字字符串与一个数字字符相乘的函数,mul(string s,char ch)

2)定义俩数字字符串相加的函数,add(string s1,string s2)

3)处理字符串num1与字符串num2中每一位数字相乘的结果用temp暂时保存,同时要考虑该位数字处在哪一位上,就在所得结果后加上对应的0.最后使用add函数将result和temp相加。

注意,最后有这样一些情况——num1="0"或者num2="0",或者所得结果左边会有大量的无效零出现,这就要做相应的处理了。

class Solution {

public:

    string mul(string s,char ch)

    {

        string res="";

        int carry=0;

        for(int i=s.size()-1;i>=0;i--)

        {

            int num=(ch-'0')*(s[i]-'0')+carry;

            int d=num%10;

            carry=num/10;

            char ch_i=d+'0';

            res=ch_i+res;

        }

        if(carry!=0)

        {

            char car=carry+'0';

            res=car+res;

        }

        return res;

    }

    string add(string s1,string s2)

    {

        string res="";

        int carry=0;

        int len1=s1.size(),len2=s2.size();

        int i,j;

        for(i=len1-1,j=len2-1;i>=0||j>=0;)

        {

            int num;

            if(j<0)

            {

                num=(s1[i]-'0')+carry;

                i--;

            }

            else if(i<0)

            {

                num=(s2[j]-'0')+carry;

                j--;

            }

            else

            {

                num=(s1[i]-'0')+(s2[j]-'0')+carry;

                i--;

                j--;

            }

            int d=num%10;

            carry=num/10;

            char ch_i=d+'0';

            res=ch_i+res;

        }

        if(carry!=0)

        {

            char car=carry+'0';

            res=car+res;

        }

        return res;

    }

    string multiply(string num1, string num2) {

        int len1=num1.size(),len2=num2.size();

        string result="";

        if(len1<=0)

            return num2;

        else if(len2<=0)

            return num1;

        for(int i=len2-1;i>=0;i--)

        {

            string temp=mul(num1,num2[i]);

            for(int j=0;j<len2-1-i;j++)

                temp+='0';

            result=add(result,temp);

        }

        //处理result左边无效零的情况

        int i=0;

        while(result[i]=='0')

            i++;

        if(i==result.size())

            return "0";

        string str=result.substr(i,result.size()-i);

        return str;

    }

};

 思路2:用数组来模拟竖式乘法,但是高位进位处理比较麻烦,具体看代码。

class Solution {

public:

    string multiply(string num1, string num2) {

        reverse(num1.begin(),num1.end());

        reverse(num2.begin(),num2.end());

        int len1=num1.size(),len2=num2.size();

        string s(len1+len2,'0');

        for(int i=0;i<len1;i++)

        {

            int carry=0;

            for(int j=0;j<len2;j++)

            {

                int digit=s[i+j]-'0';

                int num=(num1[i]-'0')*(num2[j]-'0');

                int res=digit+num+carry;

                s[i+j]=(res%10)+'0';

                carry=res/10;

            }

            int index=i+len2;

            while(carry!=0)

            {

                int digit=s[index]-'0';

                int res=digit+carry;

                s[index]=(res%10)+'0';

                carry=res/10;

            }

        }

        int i=s.size()-1;

        while(s[i]=='0'&&i>=0)

            i--;

        if(i<0)

            return "0";

        string str=s.substr(0,i+1);

        reverse(str.begin(),str.end());

        return str;

    }

};

 

你可能感兴趣的:(String)