面试题-----大数相乘问题

7 篇文章 0 订阅
1 篇文章 0 订阅

在计算机中存储数据的大小是有限的,当我们需要表示一个很大的数的时候应该很自然就能想到用字符串。字符串相乘问题在笔试面试中也比较常见,直接上思想:

我们可以借助于可动态调整大小的数据结构(vector,string,deque)模拟实现数字的乘法操作。对于普通的乘法,我们知道m位数和n位数相乘,最后的结果位数在区间[m+n-1,m+n]内。
举个例子:25*23
这里写图片描述

就是标准的手动乘法运算,只不过通常是用第一个数字去乘第二个数字中的每一位,然后将结果相加。就是左边这种情况,而右边这种情况实际上就是23*25 。我们使用两个嵌套的for循环,从每个输入数字的末尾开始。利用一个预先分配好空间的string保存部分结果。然后每次将部分部分结果进行累加。需要注意的一个特殊情况是,在最后需要去除掉结果最开始多余的0

class Solution {
public:
    string multiply(string num1, string num2) {
        int size1 = num1.size();
        int size2 = num2.size();
        if(size1 == 0 || size2 == 0) 
            return num1;
        if(num1 == "0"||num2 == "0")  //判断如果其中一个字符串为0,直接返回0
            return "0";
        //因为两个数字相乘结果的位数不会超过size1+size2,所以开辟这么大的空间
        string s(size1 + size2, '0');
        for(int i = size1 - 1; i >= 0; i--)
        {
            int mul = 0;//保存进位
            for(int j = size2 - 1; j >= 0; j--)
            {
                //计算两个数字中某一位的相乘结果并加上进位和之前保存的结果
                int tmp = (s[i + j + 1] - '0') + (num1[i] - '0') * (num2[j] - '0') + mul; 
                s[i + j + 1] = tmp - mul * 10;//先保存不考虑进位时候的结果
                mul = tmp / 10;//更新进位
            }
            s[i] += mul;  //保存一轮计算完的最后一个进位
        }
        if(s[0] == '0')//去除结果开头的0
            s = s.substr(1, s.size());
        return s;
    }
};

还是不太理解的,举个例子调试一把就懂!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值