当前位置: 首页 > news >正文

【leetcode】 字符串相乘(大数相乘、相加)

记录一下大数相乘相加方法:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

原题:. - 力扣(LeetCode)

解题思路:

        由题目可知输入字符串的长度在[1,200],所以想转成整数再计算肯定是不行的,题目也要求了不能转换为整数。

        想一想小学教的列竖式进行计算乘法的步骤,例如:

          

两个数分称为num1 (1234)和num2(5678):

① num2 的个位(8)分别去与num1的每一位去相乘,得到一个数,同样以字符串的形式存储(数字太长也会溢出,存不了)

  • 字符  - ‘0’ 即可得到对应的数字
  • 相乘得到的结果取余push_back到string的一个变量中,同时记录进位情况
  • 个位算完后,反转一下得到第一层结果,同时需要再次转为字符存储(对每个字符进行+ ‘0’)操作
  • 将结果与"0"进行累加 

② num2 的十位同理按照1的步骤去分别与num1的每位数字相乘,记录得到的结果,然后再累加

③ 后面同理

        注意:记得补0 ,第一层不用补(以第一层为对齐),第二层补一个,第三层补2个。

④ 处理字符串相加:

        操作方法类似,相加的结果同样保存在字符串中。同样依次去除两个操作数的个位、十位等进行转换并累加,记录进位情况。

        将每次计算的和取余放到string中,然后反转---再转为字符串。

代码如下:

#include <iostream>
#include <string>
#include <algorithm>using namespace std;class Solution {
public:string stringMultipy(string num1, string num2) {if(num1 == "0" || num2 == "0") {return "0";}int m = num1.size();int n = num2.size();string ans = "0";for(int i = n -1; i >= 0 ; i--) {string cur;//每一层进行补零对齐for(int j = n -1; j > i; j--) {cur.push_back(0);}int x = num2.at(i) - '0';int add = 0;for(int j = m - 1; j >= 0 ; j--) {int y = num1.at(j) - '0';int result = x * y + add;cur.push_back(result % 10);add = result / 10;}if(add != 0) {cur.push_back(add % 10);add /= 10;}reverse(cur.begin(), cur.end());for(auto &c : cur) {c += '0';}ans = addString(ans, cur);}return ans;}string addString(string num1, string num2) {int m = num1.size() - 1;int n = num2.size() - 1;int add = 0;string ans;while(m >= 0 || n >= 0 || add != 0) {int x = m >= 0? num1.at(m) - '0' : 0;int y = n >= 0? num2.at(n) - '0' : 0;int result = x + y + add;ans.push_back(result % 10);add = result / 10;m--;n--;}reverse(ans.begin(), ans.end());for(auto &c : ans) {c += '0';}return ans;}
};int main()
{string str1;string str2;cin >> str1 >> str2;Solution sol;cout << str1 << " * " << str2 << " = " << sol.stringMultipy(str1, str2) << endl;cout << str1 << " + " << str2 << " = " << sol.addString(str1, str2) << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32的TIM1之PWM互补输出_死区时间和刹车配置
  • 内容安全(深度行为检测技术、IPS、AV、入侵检测方法)
  • arcgis怎么选取某个指定区域地方的数据,比如从全国乡镇数据选取长沙市乡镇数据
  • Blackbox AI:你的智能编程伙伴
  • SQL概述及其规则与规范
  • 【BUG】已解决:NOAUTH Authentication required
  • ctfshow-web入门-php特性(web127-web131)
  • VulnHub:CK00
  • Python编程工具PyCharm和Jupyter Notebook的使用差异
  • LeetCode-随机链表的复制
  • gin框架 POST 请求参数绑定 JSON数据ShouldBind 使用注意事项 - 结构体必须定义json标签
  • 使用llama-cpp-python制作api接口
  • 力扣第十五题——三数之和
  • 基于秒杀系统的企业开发设计思考
  • LFU算法实现笔记
  • Android系统模拟器绘制实现概述
  • happypack两次报错的问题
  • If…else
  • MySQL用户中的%到底包不包括localhost?
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP 7 修改了什么呢 -- 2
  • React16时代,该用什么姿势写 React ?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring核心 Bean的高级装配
  • SQL 难点解决:记录的引用
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 实战|智能家居行业移动应用性能分析
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数组大概知多少
  • 算法-插入排序
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一份游戏开发学习路线
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 如何正确理解,内页权重高于首页?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #13 yum、编译安装与sed命令的使用
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)进入MySQL 【事务】
  • (学习总结16)C++模版2
  • (转)Mysql的优化设置
  • (转)可以带来幸福的一本书
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET技术成长路线架构图
  • .net经典笔试题