大数相加,大数相乘

题目:
大数相加链接
在这里插入图片描述
思路:
为了方便两个字符串相加,我们将短的字符串,前面补0,最重要的一点是我们需要设置进位标志ok

代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int ok=0;
        string ret;
        int size_num1=num1.size();
        int size_num2=num2.size();
        int longsize=max(size_num1,size_num2);
        for(int i=size_num1;i<longsize;i++)
        {
            num1="0"+num1;

        }
        for(int i=size_num2;i<longsize;i++)
        {
            num2="0"+num2;

        }

        for(int i=longsize-1;i>=0;--i)
        {
            
            char c=num1[i]+num2[i]-'0'+ok;
            if(c>'9')
            {
                ok=1;
                c=c-10;

            }
            else
            {
                ok=0;
            }

            ret=c+ret;
        }
        if(ok==1)
        {
            ret="1"+ret;
        }



        return ret;

    }
};

题目:
大数相乘链接
大数相乘链接

思路:
这题思路其实很巧妙,首先我们必须知道 两个都不为0 的数,相乘 ,得出的积的长度一定是len1+len2-1或者是len1+len2。(eg.100100=10000 9999=9801 长度变化 2 2 5, 2 2 4) 。

我们还可以知道 ,当我们设置结果是 len(arr)= len1+len2,我们可以发现 arr[i+j+1]=arr[i]+(num[i]*num[j]) ;
在这里插入图片描述

最后对arr进行进位处理,只能从后向前进行遍历,并且进位。

for(int i=arr_v.size()-1;i>0;i--)
  {
         arr_v[i-1]=arr_v[i-1]+arr_v[i]/10;
         arr_v[i]=arr_v[i]%10;
     }

最后如何arr[0]==0 证明结果长度是len1+len2-1 则去掉这个元素,余下元素依次拼接就可以了

代码:

class Solution {
public:
    string multiply(string num1, string num2) 
    {
        if(num1=="0"||num2=="0") return "0";

        vector<int> arr_v(num1.size()+num2.size(),0);//两个都不为0的数相乘,最终结果长度要么是num1+num2-1,要么是num1+num2

      

        for(int i=num1.size()-1;i>=0;i--)
        {
            for(int j=num2.size()-1;j>=0;j--)
            {
                arr_v[i+j+1]+=(num1[i]-'0')*(num2[j]-'0');//字符转换成整数
            }


        }

//下面这种遍历也是可以的
        //    for(int i=0;i<num1.size();i++)
        // {
        //     for(int j=0;j<num2.size();j++)
        //     {
        //         arr_v[i+j+1]+=(num1[i]-'0')*(num2[j]-'0');//字符转换成整数
        //     }


        // }
        
        for(int i=arr_v.size()-1;i>0;i--)
        {
            arr_v[i-1]=arr_v[i-1]+arr_v[i]/10;
            arr_v[i]=arr_v[i]%10;
        }

     

        string s="";
        for(int i=0;i<arr_v.size();i++)
        {
            

            if(i==0&&arr_v[i]==0) continue;

            s=s+to_string(arr_v[i]);

          
        }

        return s;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值