【Multiply Strings】cpp

题目:

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.

代码:

复制代码
class Solution {
public:
    string multiply(string num1, string num2) {
            const int n1 = num1.size(), n2 = num2.size();
            if ( num1=="0" || num2=="0") return "0";
            vector<char> ret;
            for ( int i=n1-1; i>=0; --i )
            {
                vector<char> local(1,'0');                
                int v = 0, carry = 0, curr = 0;
                for ( int j=n2-1; j>=0; --j )
                {
                    v= (num1[i]-'0')*(num2[j]-'0');
                    carry = v/10;
                    curr = v%10;
                    carry += ((local[0]-'0')+curr)/10;
                    curr = ((local[0]-'0')+curr)%10;
                    local[0] = curr+'0';
                    local.insert(local.begin(), carry+'0');
                }
                if (local[0]=='0') local.erase(local.begin());
                // cout << string(local.begin(),local.end()) << endl;
                // add zeros
                for ( int z=n1-1; z>i; --z) local.push_back('0');
                // cout << string(local.begin(),local.end()) << endl;
                carry = 0, curr = 0;
                for ( int r=ret.size()-1, l=local.size()-1; r>=0 || l>=0; --r,--l )
                {
                    if ( r>=0 && l>=0 )
                    {
                        curr = (carry+(ret[r]-'0')+(local[l]-'0'))%10;
                        carry = (carry+(ret[r]-'0')+(local[l]-'0'))/10;
                        local[l] = curr+'0';
                    }
                    else
                    {
                        curr = (carry+(local[l]-'0'))%10;
                        carry = (carry+(local[l]-'0'))/10;
                        local[l] = curr+'0';
                    }
                }
                if (carry!=0) { local.insert(local.begin(), carry+'0'); }
                ret = local;
            }
            return string(ret.begin(),ret.end());
    }
};
复制代码

tips:

就是一些字符串操作的细节,考虑进位,0这类的细节。

======================================

第二次过这道题,憋了好久。主要是有个思维误区,认为tmp比ret最多多一位;但是,比如52*4这样的例子,2*4=8 50*4=200就不止一位了。

解决了这个误区,代码AC了。

复制代码
class Solution {
public:
    string multiply(string num1, string num2) {
            if ( num1=="0" || num2=="0" ) return "0";
            vector<char> ret(num2.size(),'0');
            for ( int i=num1.size()-1; i>=0; --i )
            {
                // mupltiply ret
                vector<int> tmp;
                int val = 0, carry = 0;
                for ( int j=num2.size()-1; j>=0; --j )
                {
                    val = (num2[j]-'0')*(num1[i]-'0')+carry;
                    tmp.insert(tmp.begin(), val%10);
                    carry = val/10;
                }
                if ( carry>0 ) tmp.insert(tmp.begin(), carry);
                for ( int k=0; k<num1.size()-1-i; ++k ) tmp.push_back(0);
                // merge tmp & ret
                while ( tmp.size()>ret.size() ) ret.insert(ret.begin(),'0');
                val = 0;
                carry = 0;
                for ( int m=tmp.size()-1; m>=0; --m )
                {
                    val = (ret[m]-'0') + tmp[m] + carry;
                    ret[m] = val%10+'0';
                    carry = val/10;
                }
                if ( carry>0 ) ret.insert(ret.begin(), carry+'0');
            }
            return string(ret.begin(), ret.end());
    }
};
复制代码

 

posted on   承续缘  阅读(188)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示