zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    一个很诡异的javascript问题
    记录我开发鞋服行业供应链软件的历程<设计业务层>
    为什么要自已写报表中心
    关于系统的性能
    “时间”都去哪儿了?性能调优分析方法与案例详解
    工程师推荐软件
    终于有人把云计算、大数据和人工智能讲明白了!
    C# Dictionary 泛型字典集合(转)
    DEV中的TreeList控件应用的一个小效果实现
    推荐VS2008插件CodeRush Xpress for C#
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3801543.html
Copyright © 2011-2022 走看看