题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。通过次数71,351提交次数167,877

解题代码与测试

 Created by tannzh on 2020/7/7.///* * 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。 */#include #include using std::string;class Solution {public:    string multiply(string num1, string num2) {        string ret(num1.size() + num2.size(), '0');        for (int i = num1.size()-1; i >= 0; --i) {            int carry = 0;            for (int j = num2.size()-1; j >= 0; --j) {                int sum = (ret[i+j+1]-'0') + (num1[i]-'0') * (num2[j]-'0') + carry;                ret[i+j+1] = sum%10 + '0';                carry = sum/10;            }            ret[i] += carry;        }        size_t pos = ret.find_first_not_of('0');        if (pos != string::npos) return ret.substr(pos);        else return "0";    }};int main(int argc, char **argv){    std::string num1 = "123", num2 = "456";    std::string num3 = "2", num4 = "3";    Solution s;    std::cout << s.multiply(num1, num2) << std::endl;    std::cout << s.multiply(num3, num4) << std::endl;    return 0;}

解题思路分析

这道题就是考察大数乘法了。

我们还是从简单的例子来分析:

1234567 *8901234

想想,乘法是如何运算的,用比较小的数举例,更好理解:

    23 *    43    ----    69 +   92   -----   989

我们将 43 视作 num1, 23 视作 num2, 那么这是一个很明显的两级 for 循环。从尾部开始,外部遍历 num1, 内部遍历 num2. 注意进位。

如果给定的是字符串,显然,我们是从字符串的末尾开始遍历的。

另外一个隐藏的规律是:num1 * num2 结果的位数必然小于 num1 的位数 + num2 的位数。 所以可以设结果为 string ret(num1.size() + num2.size(), '0');

for (size_t i = num1.size()-1; i >= 0; --i) {    int carry = 0;    for (size_t j = num2.size()-1; j >= 0; --j) {        int sum = (ret[i+j+1] - '0') + (num1[i] - '0') * (num2[j] - '0') + carry;        ret[i+j+1] = sum % 10 + '0';        carry = sum / 10;    }    ret[i] += carry;}

得到的结果依旧是从尾部开始铺陈开的,所以最终还要去掉开头初始化时的 0。

size_t pos = ret.find_first_not_of('0');if (pos != string::npos) return ret.substr(pos);else return "0";

提交 .

cout输出字符串_leetcode C++题解系列-042 字符串相乘相关推荐

  1. 字符串不替代_TI-Nspire 系列的字符串操作

    本文遵循 CC BY-NC-SA 协议. 一 前言 在编程中,对字符串进行操作是很常见的.但是TI-Nsipre 对字符进行操作的函数有限,缺少一些如在字符串中插入字符.删除字符等常用功能,给编程带来 ...

  2. redis 系列10 字符串对象

    redis 系列10 字符串对象 原文:redis 系列10 字符串对象 一. 字符串对象编码 Redis中字符串可以存储3种类型,分别是字节串(byte string).整数.浮点数.在上章节中讲到 ...

  3. c++ 总结之 cout输出

    目录 使用 cout 输出 cout 与 << 运算符 cout 基本类型 cout 指针 cout 拼接输出 cout 与 put() cout 与 write() 使用 cout 格式 ...

  4. Python CheckiO 题解系列 丨 博客目录索引

    CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本题解系列主要记录自己在用 Python 闯关时的做 ...

  5. php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解

    PHP输出缓冲控制Output Control系列函数详解,output函数详解 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到 ...

  6. 力扣 旋转字符串 C语言 题解

    力扣 旋转字符串 文章目录 力扣 旋转字符串 一.完整题目 二.解题思路 三.编写代码 四.测评结果 五.总结评价 一.完整题目 给定两个字符串, s 和 goal. 如果在若干次旋转操作之后,s 能 ...

  7. python正则表达式中的r与转义字符_左手用R右手Python系列13——字符串处理与正则表达式...

    原标题:左手用R右手Python系列13--字符串处理与正则表达式 杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化.个 ...

  8. Python连载系列:字符串和常见数据类型

    Python连载系列:字符串和常见数据类型 github地址:https://github.com/hellgoddess/PythonGuide 字符串和常见数据类型 列表基本用法 - 定义列表 / ...

  9. 【编程面试系列】字符串总结

    数据结构 字符串 1 旋转字符串 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部, 如把字符串"abcdef"前面的2个字符'a'和'b'移动到字符串的尾部,使得原 ...

最新文章

  1. 谷歌小姐姐开源姿势动画师项目,组合现有TF模型,只需一张SVG图片便可配置...
  2. NDK历史版本下载方法
  3. 安全漏洞——如何查找和修复它们
  4. 【知识索引】【李宏毅机器学习】
  5. mac jenkins下载与安装
  6. Amaze UI貌似挂了。。。附上amaze UI框架的图标
  7. 阿里云企业邮箱的imap和pop3设置
  8. win7怎么查找网络上的计算机,Win7系统无法查看工作组计算机如何解决? Win7系统查看工作组计算机的方法...
  9. Photoshop 抠图(基础篇)
  10. windows 通过快捷键来复制粘贴当前日期时间到剪贴板
  11. gsm无线热点数据采集服务器,GSM无线网络优化及WLAN热点分析工具开发
  12. 【内推】阿里云 云原生团队 2022 届秋招
  13. 给你看个宝贝:GitHub 最野的开源库,把你拿捏的死死的。。。
  14. Create BD link
  15. 防火墙软件Netfilter之包过滤技术(转)
  16. 通过域名访问接口,报400
  17. qsort 用法详解
  18. 西南科技大学Linux实验名称:实验二 Linux环境网络管理
  19. 巴比特 | 元宇宙每日必读:杭州亚运会组委会将发售“亚运在中国”系列数字藏品;“戏曲元宇宙”戏曲元宇宙”是啥?怎么建?...
  20. python给折线图区间填充颜色_Python气象数据处理与绘图(3):以EOF为例画柱状图(折线图)和带地图底图的填色图...

热门文章

  1. QT5主界面“关闭窗口”按钮设置弹出提示询问信息
  2. 基于Python的开源人脸识别库,离线识别率高达99.38%
  3. 手把手带你玩转Tensorflow 物体检测 API (3)——训练模型
  4. 使用mysqldump 导出sql数据
  5. yii2 提供接口给java_yii2写api接口步骤
  6. 疯狂java讲义价格_疯狂java讲义
  7. 11210怎么等于24_想要消耗100大卡热量,怎么做才最简单?
  8. linux中cv调用摄像头,ubuntu中opencv调用摄像头
  9. java smp_什么是SMP系统
  10. python 默认配置文件_python各类配置文件写法