Multiply Strings

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


思路:重新编写乘法、加法函数

尤其注意究竟是数字操作还是字符本身操作,在好几个地方被卡主,都是保存为string的时候没有能够保存正确。

本题的思路遵循常见乘法思路:超过一位的两数相乘,把位数小的作为乘数,按照位数小的数,按位相乘。

程序的一个技巧就是,每每计算一次,就使得zeros后面添加一个0,这样移到下一位的时候就不需要额外的乘以10,而且还是字符串的形式。

但是最重要的就是编写字符串相乘函数,字符串相加函数,主要考虑相乘相加进位因素。


代码:

class Solution {
public:
//https://leetcode.com/problems/multiply-strings/
        string addBig(string num1,string num2){
            int m=num1.size(),n=num2.size();
            
            if(m<n){
                swap(num1,num2);
                swap(m,n);
            }
            
            int flag=0,i=m-1,j=n-1;
            int a=0;
            while(i>=0){
                if(i>=0){
                    a+=num1[i]-'0'+flag;
                }
                if(j>=0){
                    a+=num2[j--]-'0';
                }
                flag=a/10;
                num1[i--]=(a)%10+'0';a=0;
            }
            if(flag>0){
                num1.insert(num1.begin(),flag+'0');
            }   
            /*
            int a = 0, i=m-1, j=n-1;
            while (i >= 0) {
            int x = a;
            if (i >= 0)
                x += num1[i--] - '0';
            if (j >= 0)
                x += num2[j--] - '0';
                
            num1[i+1] = x % 10 + '0';
            a = x / 10;
        }
        
        if (a > 0) 
            num1.insert(num1.begin(), '1');
            */
            return num1;
        }

        string multiplySingleNumber(string num,char c){
            string result;
            int flag=0;
            if(c=='0')  {
                return "0";
            }
            for(int i=num.length()-1;i>=0;i--){
                int a=(num[i]-'0')*(c-'0')+flag;
                num[i]=(a)%10+'0';
                flag=a/10;
            }
            if(flag>0){
                num.insert(num.begin(),flag+'0');
            }
            return num;
        }


    string multiply(string num1, string num2) {
        
        int m=num1.size();
        int n=num2.size();
        
        if(m<n){
            swap(m,n);
            swap(num1,num2);
        }
        string result,zeros;
        result="0";
        for(int i=n-1;i>=0;i--){
            if(num2[i]!='0'){
            string s=multiplySingleNumber(num1,num2[i]);
            s+=zeros;
            result=addBig(s,result);
            }
            zeros.append(1,'0');
        }
        
        /*for(int i=n-1;i>=0;i--){
            if(num2[i]!='0'){
            zeros=multiplySingleNumber(num1,num2[i]);
            zeros.append(n-1-i,'0');
            result=addBig(zeros,result);
            }
        }*/
        while((int)result.size()>1&&result[0]=='0'){
            result.erase(result.begin());
        }
        return result;
        
    }
    
};


原文地址:https://www.cnblogs.com/jsrgfjz/p/8519912.html