读完本文,你可以去力扣拿下如下题目:

43.字符串相乘

———–

对于比较小的数字,做运算可以直接使用编程语言提供的运算符,但是如果相乘的两个因数非常大,语言提供的数据类型可能就会溢出。一种替代方案就是,运算数以字符串的形式输入,然后模仿我们小学学习的乘法算术过程计算出结果,并且也用字符串表示。

需要注意的是,num1 和 num2 可以非常长,所以不可以把他们直接转成整型然后运算,唯一的思路就是模仿我们手算乘法。

比如说我们手算 123 × 45,应该会这样计算:

计算 123 × 5,再计算 123 × 4,最后错一位相加。这个流程恐怕小学生都可以熟练完成,但是你是否能把这个运算过程进一步机械化,写成一套算法指令让没有任何智商的计算机来执行呢?

你看这个简单过程,其中涉及乘法进位,涉及错位相加,还涉及加法进位;而且还有一些不易察觉的问题,比如说两位数乘以两位数,结果可能是四位数,也可能是三位数,你怎么想出一个标准化的处理方式?这就是算法的魅力,如果没有计算机思维,简单的问题可能都没办法自动化处理。

首先,我们这种手算方式还是太「高级」了,我们要再「低级」一点,123 × 5 和 123 × 4 的过程还可以进一步分解,最后再相加:

现在 123 并不大,如果是个很大的数字的话,是无法直接计算乘积的。我们可以用一个数组在底下接收相加结果:

整个计算过程大概是这样,有两个指针 i,j 在 num1 和 num2 上游走,计算乘积,同时将乘积叠加到 res 的正确位置:

现在还有一个关键问题,如何将乘积叠加到 res 的正确位置,或者说,如何通过 i,j 计算 res 的对应索引呢?

其实,细心观察之后就发现,num1[i] 和 num2[j] 的乘积对应的就是 res[i+j] 和 res[i+j+1] 这两个位置。

明白了这一点,就可以用代码模仿出这个计算过程了:

string multiply(string num1, string num2) {

int m = num1.size(), n = num2.size();

// 结果最多为 m + n 位数

vector res(m + n, 0);

// 从个位数开始逐位相乘

for (int i = m - 1; i >= 0; i--)

for (int j = n - 1; j >= 0; j--) {

int mul = (num1[i]-'0') * (num2[j]-'0');

// 乘积在 res 对应的索引位置

int p1 = i + j, p2 = i + j + 1;

// 叠加到 res 上

int sum = mul + res[p2];

res[p2] = sum % 10;

res[p1] += sum / 10;

}

// 结果前缀可能存的 0(未使用的位)

int i = 0;

while (i < res.size() && res[i] == 0)

i++;

// 将计算结果转化成字符串

string str;

for (; i < res.size(); i++)

str.push_back('0' + res[i]);

return str.size() == 0 ? "0" : str;

}

至此,字符串乘法算法就完成了。

总结一下,我们习以为常的一些思维方式,在计算机看来是非常难以做到的。比如说我们习惯的算术流程并不复杂,但是如果让你再进一步,翻译成代码逻辑,并不简单。算法需要将计算流程再简化,通过边算边叠加的方式来得到结果。

俗话教育我们,不要陷入思维定式,不要程序化,要发散思维,要创新。但我觉得程序化并不是坏事,可以大幅提高效率,减小失误率。算法不就是一套程序化的思维吗,只有程序化才能让计算机帮助我们解决复杂问题呀!

也许算法就是一种寻找思维定式的思维吧,希望本文对你有帮助。

程序员灯塔

转载请注明原文链接:字符串乘法

计算机公式乘法字处理,字符串乘法相关推荐

  1. 乘法计算机公式,在word中乘法的函数公式计算公式

    word文档里的乘法公式是什么 首先得给你讲讲word单元格的编码是怎么样的. 由于不好插图片,自己看下面的 表格中的编码是这样的 第一行 A1 B1 C1 D1 E1-- 第二行 A2 B2 C2 ...

  2. 计算机公式与函数乘法,excel常用函数乘法公式的使用方法

    Excel中经常需要使用到乘法公式进行计算求积,乘法公式具体该如何进行使用呢?下面是学习啦小编带来的关于excel常用函数乘法公式的使用方法,希望阅读过后对你有所启发! excel常用函数乘法公式使用 ...

  3. 计算机中的乘法函数公式,教程方法;excel乘法函数_excel乘法公式电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;excel乘法函数_excel乘法公式电脑技巧,以下是给大家带来的教程方法;excel乘法函数_excel乘法公式,大家可以了解一下哦! excel乘法函数 Excel中经常会 ...

  4. mysql 乘法拼接字符串_【原创】利用MySQL 的GROUP_CONCAT函数实现聚合乘法

    MySQL 聚合函数里面提供了加,平均数,最小,最大等,但是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法. 先创建一张示例表:CREATE TABLE `tb_ ...

  5. 乘法最快的算法计算机,人类史上最快乘法算法诞生

    人类用四千年碰到乘法运算天花板:史上最快乘法算法诞生 中科院物理所 2019-04-16 12:21:55 图片:MENGXIN LI/QUANTA MAGAZINE 四千年前,古巴比伦人最先发明了乘 ...

  6. 计算机组成原理14-定点数的乘法与除法运算

    目录 一.乘法运算 1.分析笔算乘法 2.笔算乘法的改进 3.原码一位乘法 4.原码两位乘法 5.补码一位乘法 6.补码两位乘 二.除法运算 1.分析笔算除法 2.原码除法 (1)恢复余数法 (2)加 ...

  7. 计算机公式与函数的定义及两者的关系,excel(公式与函数).ppt

    excel(公式与函数) 第4章 Excel电子表格 公式介绍 与数学公式类似,对数据进行各种四则运算. 以"="开头,后面接各种表达式 例:求计算机 .英语和数学三门功课的总分 ...

  8. sqlserver 替换字符串中的数字_VBA实用小程序60: 替换图表SERIES公式中的字符串...

    学习Excel技术,关注微信公众号: excelperfect 大家知道,Excel图表的每个系列使用的数据都是由SERIES公式来确定的.当我们选取图表中的某个数据系列时,在公式栏中就会显示相应的S ...

  9. c语言 乘法运算符,C 乘法运算符

    C 乘法运算符 11/04/2016 本文内容 乘法运算符执行乘法 (*).除法 (/) 和余数 (%) 运算 . 语法 multiplicative-expression:     cast-exp ...

最新文章

  1. wget 命令用法详解
  2. 解决Missing artifact com.sun:tools:jar:1.5.0方法
  3. Nagios配置文件上传
  4. 组件生命周期管理和通信方案
  5. java二维数组高纬低纬_2018-05-17 第十一天
  6. 502 Bad Gateway - Registered endpoint failed to handle the request
  7. oracle sql文字列函数,Oracle 数据库SQL中 decode()函数简介
  8. 我该如何维护一个烂项目?
  9. 六步实现Spring.NET 与 NHibernate 的整合
  10. 从零开始使用CodeArt实践最佳领域驱动开发(三)
  11. 即时通信软件开发的年轻开发者曾注意到
  12. Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)
  13. 美团外卖回应佣金争议;苹果回应戴口罩解锁 iPhone;新 Edge 浏览器明年将不再支持 Win7 | 极客头条...
  14. Python中断多重循环的几种思路exit_flag
  15. 记录下我磕磕碰碰的三个月找工作经历,BAT大厂面试总结
  16. iphone越狱 -- 红雪越狱工具
  17. javaweb区分PC端和移动端
  18. 2018江苏高考数学第16题计算量大不大你自己看着办
  19. 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
  20. 健康数据的获取 Iphone

热门文章

  1. 用长微博工具发布长微博
  2. Linux那些事儿之我是U盘(1)小城故事
  3. asp.net 页面加载
  4. iOS HAMC(哈希)256带密钥的加密方法
  5. 中国移动飞信免费发短信API接口(第三方)
  6. Kaggle实战:Store Sales - Time Series Forecasting
  7. creo视图管理器使用方法_Creo Parametric 4.0 界面基础介绍
  8. 十款入门级微信小程序源码分享之三
  9. 中国联通北斗国星卡,终身免话费+流量费,网友:全都是套路
  10. 大众点评大数据 hadoop 应用案例