【C++经典例题】基于字符串实现大数相乘问题

【C++经典例题】基于字符串实现大数相乘问题
.💓 博客主页:倔强的石头的ZEEKLOG主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注


文章目录

一、问题描述

在实际编程中,我们经常会遇到需要处理大整数的情况。由于编程语言中内置整数类型(如 intlong 等)有其表示范围的限制,当需要处理的整数超出这些范围时,就不能直接使用内置类型进行计算。
一般的解决方式是以两个以字符串形式表示的非负整数 num1num2 的乘法,并将结果也以字符串形式返回。

输入限制

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

二、解题思路

要解决这个问题,我们可以模拟手工乘法的过程。在手工乘法中,我们将一个数的每一位与另一个数的每一位相乘,然后将结果相加,并处理进位。具体步骤如下:

  1. 特殊情况处理:如果 num1num2"0",则直接返回 "0"
  2. 反转字符串:为了方便从低位到高位进行计算,我们将 num1num2 反转。
  3. 初始化结果数组:创建一个长度为 num1.size() + num2.size() 的数组 ret,用于存储中间结果。因为两个数相乘的结果位数不会超过这两个数的位数之和。
  4. 逐位相乘:使用两层循环,将 num1 的每一位与 num2 的每一位相乘,并将结果累加到 ret 数组的相应位置。
  5. 处理进位:遍历 ret 数组,将每一位的进位加到下一位。
  6. 去除前导零:由于结果数组可能存在前导零,我们需要将其去除。
  7. 转换为字符串:将处理好的结果数组转换为字符串。

三、代码实现

#include<string>#include<algorithm>classSolution{public: string multiply(string num1, string num2){// 先判断是否有一个为0if(num1 =="0"|| num2 =="0")return"0";// 反转两个字符串方便操作reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());// 结果位数不超过两个字符串之和int size = num1.size()+ num2.size();// 创建存储结果的数组并初始化为0int* ret =newint[size]();// 字符串相乘,不考虑进位for(int i =0; i < num1.size();++i){for(int j =0; j < num2.size();++j){ ret[i + j]+=(num1[i]-'0')*(num2[j]-'0');}}// 处理进位for(int i =0; i < size -1;++i){ ret[i +1]+= ret[i]/10; ret[i]= ret[i]%10;}// 去除前导零int i = size -1;while((ret[i]==0)&&(size >1)){--size;--i;}// 转字符串 string s =""; s.reserve(size);for(int i = size -1; i >=0;--i){ s +=('0'+ ret[i]);}// 释放动态分配的内存delete[] ret;return s;}};

四、代码详细分析

1. 特殊情况处理

if(num1 =="0"|| num2 =="0")return"0";

如果 num1num2"0",则它们的乘积一定为 "0",直接返回即可。

2. 反转字符串

reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());

使用 std::reverse 函数将 num1num2 反转,这样在后续计算中可以从低位(字符串的起始位置)开始处理。

3. 初始化结果数组

int size = num1.size()+ num2.size();int* ret =newint[size]();

创建一个长度为 num1.size() + num2.size() 的整数数组 ret,并使用 () 进行值初始化,将数组元素都初始化为 0。

4. 逐位相乘

for(int i =0; i < num1.size();++i){for(int j =0; j < num2.size();++j){ ret[i + j]+=(num1[i]-'0')*(num2[j]-'0');}}

使用两层嵌套循环,将 num1 的每一位与 num2 的每一位相乘,并将结果累加到 ret 数组的相应位置。(num1[i] - '0')(num2[j] - '0') 是将字符转换为对应的数字。

5. 处理进位

for(int i =0; i < size -1;++i){ ret[i +1]+= ret[i]/10; ret[i]= ret[i]%10;}

遍历 ret 数组,将每一位的进位(ret[i] / 10)加到下一位,同时将当前位取模 10 得到该位的最终结果。

6. 去除前导零

int i = size -1;while((ret[i]==0)&&(size >1)){--size;--i;}

从结果数组的最高位开始检查,如果该位为 0 且结果长度大于 1,则将长度减 1,继续检查前一位。

7. 转换为字符串

string s =""; s.reserve(size);for(int i = size -1; i >=0;--i){ s +=('0'+ ret[i]);}

创建一个空字符串 s,并使用 reserve 方法预先分配足够的空间。然后从结果数组的最高位开始,将每一位转换为字符并添加到字符串 s 中。

8. 释放内存

delete[] ret;

由于 ret 是动态分配的数组,使用完后需要使用 delete[] 释放内存,避免内存泄漏。

五、复杂度分析

  • 时间复杂度: O ( m ∗ n ) O(m * n) O(m∗n),其中 m m m 和 n n n 分别是 num1num2 的长度。主要时间开销在于两层嵌套的循环进行逐位相乘。
  • 空间复杂度: O ( m + n ) O(m + n) O(m+n),主要空间开销在于存储中间结果的数组 ret

通过以上步骤,我们就可以实现两个大整数的乘法,并将结果以字符串形式返回。这种方法模拟了手工乘法的过程,避免了使用内置的大整数库和直接将输入转换为整数,适用于处理超出内置整数类型表示范围的大整数乘法问题。

Read more

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 目录 DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 前  言 1 环境准备 1.1 华为云开发环境 1.2 ModelArts 代金券与模型服务 1.3 启动 OpenClaw 网关 2 飞书开放平台配置 2.1 创建企业自建应用 2.2 添加机器人能力 2.3 配置应用权限 2.4 发布应用版本 3 OpenClaw 与飞书集成 3.1 配置 OpenClaw

By Ne0inhk
宇树 G1 机器人开发入门:有线 & 无线连接完整指南

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

适用读者:机器人二次开发者、科研人员 开发环境:Ubuntu 20.04(推荐) 机器人型号:Unitree G1 EDU+ 前言 宇树 G1 是一款面向科研与商业应用的高性能人形机器人,支持丰富的二次开发接口。在正式进行算法调试与功能开发之前,首要任务是建立稳定的开发连接。本文将详细介绍两种主流连接方式:有线(网线直连) 与 无线(WiFi + SSH),并附上完整的配置流程,帮助开发者快速上手。 一、有线连接(推荐新手优先使用) 有线连接通过网线直接将开发电脑与 G1 机器人相连,具有延迟低、稳定性高、不依赖外部网络的优势,是新手入门和底层调试的首选方式。 1.1 前置条件 所需物品说明开发电脑推荐安装 Ubuntu 20.04,或在 Windows 上使用虚拟机宇树 G1 机器人确保已开机且处于正常状态网线(

By Ne0inhk

实测|龙虾机器人(OpenClaw)Windows系统部署全攻略(含避坑指南)

作为一名热衷于折腾新技术的ZEEKLOG博主,最近被一款名为「龙虾机器人」的开源AI工具圈粉了!它还有个更正式的名字——OpenClaw(曾用名Clawdbot、MoltBot),不同于普通的对话式AI,这款工具能真正落地执行任务,比如操作系统命令、管理文件、对接聊天软件、自动化办公,而且支持本地部署,数据隐私性拉满。 不过调研发现,很多小伙伴反馈龙虾机器人在Windows系统上部署容易踩坑,官方文档对Windows的适配细节描述不够细致。今天就结合自己的实测经历,从环境准备、分步部署、初始化配置,到常见问题排查,写一篇保姆级攻略,不管是新手还是有一定技术基础的同学,都能跟着一步步完成部署,少走弯路~ 先简单科普下:龙虾机器人本质是一款开源AI代理框架,核心优势是“能行动、可本地、高灵活”——它不内置大模型,需要对接第三方AI接口(如GPT、Claude、阿里云百炼等),但能将AI的指令转化为实际的系统操作,相当于给AI配了一个“能动手的身体”,这也是它和普通对话大模型的核心区别。另外要注意,它还有一种“生物混合龙虾机器人”的概念,是利用龙虾壳改造的柔性机器人,本文重点分享的是可本

By Ne0inhk

ComfyUI是什么?当AI绘画遇上“连连看”,专业创作原来可以如此简单!

目录 一、开篇明义:什么是ComfyUI? 二、核心设计哲学:为什么选择节点式工作流? 1. 完全透明化的生成过程 2. 可保存、可分享、可复用的工作流 3. 精细到极致的参数控制 三、ComfyUI技术架构剖析 1.核心组件详解 2.性能优势解析 四、实际应用场景:谁需要ComfyUI? 1. AI艺术创作者 2. 产品设计与原型开发 3. 教育与研究 4. 商业内容生产 用流程图玩转Stable Diffusion,揭开AI绘画的神秘面纱 一、开篇明义:什么是ComfyUI? 如果你曾对AI绘画感到好奇,或已经尝试过Midjourney、Stable Diffusion WebUI等工具,那么ComfyUI将为你打开一扇全新的门。这不是又一个“输入文字出图片”的简单工具,而是一个可视化节点编辑器,专门为Stable Diffusion设计。

By Ne0inhk