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",但真正难的是当 num1 或 num2 长度超 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标签不被解析的问题


