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

大数高精度乘法详解

的高精度乘法题目(A * B Problem)。

解题思路:
由于题目中给出的数字最大可以达到 $10^{2000}$,这远远超过了 C 语言中long long类型(最大约 $9 \times 10^{18}$)的存储范围。因此,我们不能直接使用乘法运算符*,而需要使用数组来模拟我们小学手算的竖式乘法过程。

算法步骤:

  1. 存储:使用字符串读入两个大数,然后将它们倒序存入整型数组中(让数组下标 0 对应个位,下标 1 对应十位,以此类推),这样方便对齐计算。
  2. 乘法:使用双重循环,用第一个数的每一位去乘第二个数的每一位。
    • 规律:数组a的第i位 乘以 数组b的第j位,结果应该累加到结果数组c的第i + j位。
  3. 进位:遍历结果数组c,处理进位(c[i+1] += c[i] / 10c[i] %= 10)。
  4. 去前导零:计算完成后,结果的高位可能是 0,需要从最高位开始去除多余的 0(注意如果结果本身就是 0,要保留一个 0)。
  5. 输出:倒序输出结果数组。

C语言代码实现:

#include <stdio.h> #include <string.h> int main() { // 定义字符数组存储输入的大数,题目限制10^2000,所以开2500足够 char s1[2500], s2[2500]; // 定义整型数组存储转换后的数字和结果 // 结果的最大长度通常是两个乘数长度之和,所以开大一点,比如5000 int a[2500], b[2500], c[5000]; int lena, lenb, lenc; int i, j; // 初始化数组为0,防止垃圾值影响计算 memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); // 读入两个大数,scanf会自动跳过换行符和空格 if (scanf("%s %s", s1, s2) != 2) return 0; lena = strlen(s1); lenb = strlen(s2); // 【关键步骤1】倒序存入数组 // 将字符串转换为数字,并且倒序存储,让 a[0] 存储个位,a[1] 存储十位... for (i = 0; i < lena; i++) { a[i] = s1[lena - 1 - i] - '0'; } for (i = 0; i < lenb; i++) { b[i] = s2[lenb - 1 - i] - '0'; } // 【关键步骤2】模拟竖式乘法 // a的第i位 乘以 b的第j位,结果累加到 c的第 i+j 位 for (i = 0; i < lena; i++) { for (j = 0; j < lenb; j++) { c[i + j] += a[i] * b[j]; } } // 【关键步骤3】处理进位 // 结果的最大可能长度是 lena + lenb lenc = lena + lenb; for (i = 0; i < lenc; i++) { if (c[i] >= 10) { c[i + 1] += c[i] / 10; // 进位加到下一位 c[i] %= 10; // 当前位保留个位 } } // 【关键步骤4】去除前导零 // 从最高位(lenc-1)开始检查,如果是0且长度大于1,则长度减1 // 注意:如果结果就是0,lenc最终会变为1,保留唯一的0 while (lenc > 1 && c[lenc - 1] == 0) { lenc--; } // 【关键步骤5】倒序输出结果 for (i = lenc - 1; i >= 0; i--) { printf("%d", c[i]); } printf(" "); return 0; }

代码使用说明:

  1. 将代码复制到 C 语言编译器中。
  2. 输入两个大整数(可以分两行输入,也可以空格隔开)。
  3. 程序会输出它们的乘积。

示例测试:

  • 输入:
    2 3
    输出:6
  • 输入:
    12345678901234567890 98765432109876543210
    输出:1219326311370217952261850327336229233322374638000000(正确的高精度结果)
http://www.zskr.cn/news/1424906.html

相关文章:

  • 终极Windows热键侦探:一键揪出占用你快捷键的“元凶“
  • 洞察2026年Q2吉林钢结构安装生产:技术演进与可靠伙伴选择 - 2026年企业资讯
  • Claude Opus 4.8 实测:更精确、更诚实,但创作还是不如 4.6
  • 保姆级教程:在Unity 2022 LTS中一步步导入自定义URDF模型并实现键盘控制
  • 2026台州专业包包回收机构评测:台州黄金保管、台州黄金回收、台州黄金抵押、台州专业名表回收、台州包包回收、台州台州奢侈品回收选择指南 - 优质品牌商家
  • Windows HEIC缩略图预览:终极免费解决方案
  • 2026年高性价比镜片厂家TOP5排行:儿童专用镜片、变色镜片、手机镜、抗疲劳镜片、星乐视4.0三效压轴、渐进多焦点镜片选择指南 - 优质品牌商家
  • Qt Creator 19.0.0 (Community)下载
  • grep 命令实例教程
  • 分布式核心知识
  • 2026年当下,探寻武汉通过率高的医学类出国留学品牌公司,哪家更专业? - 2026年企业资讯
  • 别再硬啃官方文档了!Element Plus的el-select和el-input样式自定义,看这篇就够了(附完整CSS代码)
  • MATLAB掌纹识别实战工程包:预处理+Gabor纹理提取+匹配比对全链路源码
  • 深入LIN Driver状态机:搞懂Sleep/Wakeup内部唤醒与外部唤醒的实战区别
  • Claude回溯框架深度拆解:如何用4步标准化流程写出零Bug、可复用的回溯代码?
  • 从“冷备”到“虚拟化”:一文读懂锐捷WLAN三种冗余方案怎么选(集群/热备/VAC对比)
  • 为什么振浩微的芯片电源上比别的芯片多一个电阻?揭秘一阶低通滤波器的抗干扰妙用
  • 依恋类型的通信协议——你的亲密关系跑的是HTTP轮询还是WebSocket?
  • 2026年权威腻子品牌排行:杭州本地艺术漆施工、杭州杭州艺术漆、杭州油漆涂料选哪家、杭州涂料品牌推荐、杭州湖州艺术漆选择指南 - 优质品牌商家
  • 拯救者2022款装Ubuntu18.04踩坑记:升级内核到6.1后,亮度、WiFi、声音全回来了
  • CISC vs RISC 对比
  • 不止于播放:用Unity VideoPlayer组件打造交互式视频体验(进度条/音量控制/事件响应)
  • Claude市场占有率断层领先背后的“隐形护城河”:Anthropic未公开的3层安全架构与审计日志体系(限首批200份解密版)
  • 好用的校服源头工厂咨询哪家
  • 新消费品牌想被记住,先找到一个能钉进用户心里的表达
  • 图像数据增强翻车现场:水平翻转后,你的目标检测框和关键点跟上了吗?
  • 一套可直接编译运行的C语言指纹识别全流程代码,含测试图与格式读写支持
  • 微前端架构:现代前端架构新趋势
  • Cesium加载SuperMap WMTS100服务报400?别慌,可能是这个XML节点顺序的坑
  • 实时库存准确率从82%跃升至99.6%,Lindy自动化配置清单,含7个不可跳过的校验节点