华为机试热题

43.字符串相乘
c++答案:

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        string ans = "0";
        int m = num1.size(), n = num2.size();
        for (int i = n - 1; i >= 0; i--) {
            string curr;
            int add = 0;
            for (int j = n - 1; j > i; j--) {	//第二个乘数的每一位单独与第一个乘数的相乘结果后面要添加零,添加数量依次递增
                curr.push_back(0);	//这里有个疑问,push_back里面怎么不是'0',为什么没有引号,添加的不应该是字符串吗
            }
            int y = num2.at(i) - '0';	//这是把字符串变成数字的基本操作,char型可以直接转化成字符型
            for (int j = m - 1; j >= 0; j--) {	//数字的高位时字符串的低位所以从m-1到0
                int x = num1.at(j) - '0';
                int product = x * y + add;
                curr.push_back(product % 10);
                add = product / 10;
            }
            while (add != 0) {
                curr.push_back(add % 10);
                add /= 10;
            }
            reverse(curr.begin(), curr.end());
            for (auto &c : curr) {
                c += '0';
            }
            ans = addStrings(ans, curr);
        }
        return ans;
    }

    string addStrings(string &num1, string &num2) {
        int i = num1.size() - 1, j = num2.size() - 1, add = 0;	//之所以减一,是为了遍历string中每个位置的数,都是从n-1到0。
        string ans;
        while (i >= 0 || j >= 0 || add != 0) {	//相加操作,从低位开始向高位相加,相加之后总有一个数会先变成0
            int x = i >= 0 ? num1.at(i) - '0' : 0;
            int y = j >= 0 ? num2.at(j) - '0' : 0;
            int result = x + y + add;
            ans.push_back(result % 10);
            add = result / 10;
            i--;
            j--;
        }
        reverse(ans.begin(), ans.end());
        for (auto &c: ans) {
            c += '0';
        }
        return ans;
    }
};

未解决的疑问
1.这段代码有个关键疑问操作没有理解:

 for (auto &c: ans) {
        c += '0';
    }

这段代码为何能将
在这里插入图片描述
转变成
在这里插入图片描述
遍历过程中c+=‘0’到底做了什么?

2.还有string.push_back(int)时候string里面的值发生的变换都是000/这种形式吗?

3.这个判断为什么设置成循环?判断一次比就好了吗?

while (add != 0) {
    curr.push_back(add % 10);
    add /= 10;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值