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


  • 相关阅读:
    [LC] 252. Meeting Rooms
    [LC] 243. Shortest Word Distance
    [LC] 215. Kth Largest Element in an Array
    [LC] 8. String to Integer (atoi)
    [LC] 367. Valid Perfect Square
    [LC] 66. Plus One
    [LC] 7. Reverse Integer
    [GeeksForGeeks] Print all nodes that don't have sibling in a binary tree.
    [Coding Made Simple] Maximum Sum Subsequence Non-adjacent
    [Coding Made Simple] Longest Bitonic Subsequence
  • 原文地址:https://www.cnblogs.com/jsrgfjz/p/8519912.html
Copyright © 2020-2023  润新知