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;
    }
};

 

posted @ 2014-06-21 21:54  Awy  阅读(172)  评论(0编辑  收藏  举报