C++ 怎么实现大数乘法 C++字符串模拟乘法运算逻辑【算法】

发布时间 - 2026-01-26 00:00:00    点击率:
不能直接用 long long 做大数乘法,因其最大值约 1.8×10¹⁸,两个 10 位数相乘即可能溢出;上百位数字必须用字符串模拟竖式乘法,核心是正确处理进位、下标对齐(res[i+j+1])和前导零。

为什么不能直接用 long long 做大数乘法

因为 C++ 原生整型有上限:long long 最大支持约 1.8×10¹⁸,两个 10 位数相乘就可能溢出。一旦输入是几十位甚至上百位的数字(比如 RSA 密钥运算、高精度计数),必须用字符串存数,手动模拟竖式乘法逻辑。

关键不是“能不能”,而是“怎么让每位进位和位置对齐不出错”。常见错误是索引算反、进位漏加、结果前导零没删——这些在调试时极难定位。

string multiply(string num1, string num2) 的核心步骤

把两个字符串从低位到高位遍历,用数组暂存每一位的乘积和,再统一处理进位。最终转成字符串并去掉前导零。

  • 先特判 "0":任一输入为 "0",直接返回 "0"
  • vector res(num1.size() + num2.size(), 0) 存中间结果,最大位数不会超过两者长度之和
  • 双层循环:i 遍历 num1(从右往左),j 遍历 num2(从右往左),对应位相乘结果累加到 res[i+j+1](注意下标偏移)
  • 倒序处理进位:从末尾开始,res[k] / 10 加到 res[k-1]res[k] %= 10
  • 转字符串时跳过开头的 0;如果全为 0,保留一个 "0"

容易被忽略的边界细节

最常出问题的地方不在算法主干,而在字符与数字转换、索引映射和符号处理:

立即学习“C++免费学习笔记(深入)”;

  • 字符转数字必须减 '0',写成 num1[i] - '0',不能用 atoi(&num1[i])(越界且语义错误)
  • 两数位置 i(从右数第 i 位)、j(从右数第 j 位)相乘,影响的是结果中从右数第 i+j 位,所以存到 res[i+j+1](因为 res 下标 0 是最高位)
  • 如果要支持负数,先提取符号,最后拼接;但题目若明确“非负字符串”,别自行加逻辑,反而引入空指针或非法字符判断
  • 输入可能含前导零(如 "00123"),但按题意一般保证无前导零;若不确定,应在开头用 find_first_not_of('0') 截断

一个可直接验证的最小完整示例

string multiply(string num1, string num2) {
    if (num1 == "0" || num2 == "0") return "0";
    vector res(num1.size() + num2.size(), 0);
    for (int i = num1.size()-1; i >= 0; i--) {
        for (int j = num2.size()-1; j >= 0; j--) {
            int mul = (num1[i] - '0') * (num2[j] - '0');
            res[i+j+1] += mul;
        }
    }
    for (int k = res.size()-1; k > 0; k--) {
        res[k-1] += res

[k] / 10; res[k] %= 10; } string ans; int start = (res[0] == 0) ? 1 : 0; for (int i = start; i < res.size(); i++) { ans += ('0' + res[i]); } return ans; }

这段代码跑通 multiply("123", "456") 得到 "56088",但真正难的是当 num1num2 长度超 1000 时,内存访问是否越界、进位循环是否覆盖全部位置——建议用 assert(k > 0) 防止下标负溢出。


# c++  # 为什么  # String  # 整型  # 字符串  # 循环  # 指针  # 空指针  # 算法  # 遍历  # 的是  # 百位  # 往左  # 而在  # 这段  # 应在  # 不能用  # 可直接  # 每一位 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用withoutEvents方法临时禁用模型事件  高防服务器租用指南:配置选择与快速部署攻略  如何基于PHP生成高效IDC网络公司建站源码?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Android okhttputils现在进度显示实例代码  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  历史网站制作软件,华为如何找回被删除的网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel Fortify是什么,和Jetstream有什么关系  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  js实现点击每个li节点,都弹出其文本值及修改  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  网站建设要注意的标准 促进网站用户好感度!  如何在企业微信快速生成手机电脑官网?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  网页设计与网站制作内容,怎样注册网站?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  JavaScript实现Fly Bird小游戏  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  html如何与html链接_实现多个HTML页面互相链接【互相】  如何在阿里云完成域名注册与建站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  微信小程序 input输入框控件详解及实例(多种示例)  个人摄影网站制作流程,摄影爱好者都去什么网站?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  JavaScript如何实现倒计时_时间函数如何精确控制  JS弹性运动实现方法分析  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何快速搭建高效WAP手机网站?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel如何使用Blade组件和插槽?(Component代码示例)  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Swift中switch语句区间和元组模式匹配  如何在云指建站中生成FTP站点?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何利用DOS批处理实现定时关机操作详解  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何快速查询网址的建站时间与历史轨迹?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  智能起名网站制作软件有哪些,制作logo的软件?  Python函数文档自动校验_规范解析【教程】  Android Socket接口实现即时通讯实例代码  Laravel如何实现用户密码重置功能?(完整流程代码)  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  用v-html解决Vue.js渲染中html标签不被解析的问题