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

4.高精度计算

4.高精度计算

一、高精度算法(仅 C++ 需掌握)

核心背景

Java 有大整数类、Python 默认支持无限大数,C++ 需通过数组模拟大整数运算,适用于位数超 1e6 位的整数(数值范围远超long long)。

存储规则

  • 逆序存储:将大整数的个位存在数组下标 0 位,高位依次往后存(如 123456 存为[6,5,4,3,2,1]),方便进位 / 借位时在数组末尾操作(避免数组平移)。

1. 高精度加法(A + B,A、B ≥ 0)

思路

  • 模拟人工加法:从个位开始,逐位相加,加上上一位进位,当前位取和的个位(t%10),进位取和的十位(t/10);
  • 处理边界:当 A 或 B 未遍历完时,未存在的位视为 0;遍历结束后若仍有进位,需在结果末尾补 1。

代码模板(结合 PDF 优化)

#include <vector>
using namespace std;// C = A + B,A、B逆序存储(个位在0位)
vector<int> add(vector<int> &A, vector<int> &B) 
{vector<int> C;int t = 0; // 进位,初始为0for (int i = 0; i < A.size() || i < B.size(); i++) {if (i < A.size()) t += A[i];if (i < B.size()) t += B[i];C.push_back(t % 10); // 当前位结果t /= 10; // 更新进位}if (t) C.push_back(1); // 最后仍有进位return C;
}

测试案例

  • 输入:A=11(存储为[1,1]),B=99(存储为[9,9]
  • 运算过程:
    1. 个位:1+9+0=10 → 存 0,进位 1;
    2. 十位:1+9+1=11 → 存 1,进位 1;
    3. 遍历结束,进位 1 补尾 → 结果[0,1,1],逆序输出为 110。
  • 输出:110

2. 高精度减法(A - B,需满足 A ≥ B,A、B ≥ 0)

讲解思路

  • 预处理:先通过cmp函数判断 A 是否≥B,若 A<B 则计算-(B - A)
  • 模拟人工减法:从个位开始,逐位相减(减去上一位借位),若当前位不够减则借位(+10),借位标记为 1;
  • 去前导零:结果末尾若有连续 0(如 003→3),需删除(保留最后一个 0)。

代码模板(含 cmp 函数)

#include <vector>
using namespace std;// 判断A是否≥B(A、B逆序存储)
bool cmp(vector<int> &A, vector<int> &B) 
{if (A.size() != B.size()) return A.size() > B.size();for (int i = A.size() - 1; i >= 0; i--) {if (A[i] != B[i]) return A[i] > B[i];}return true; // 相等
}// C = A - B(A ≥ B)
vector<int> sub(vector<int> &A, vector<int> &B) 
{vector<int> C;int t = 0; // 借位,初始为0(t=1表示上一位借了1)for (int i = 0; i < A.size(); i++) {t = A[i] - t; // 先减去上一位借位if (i < B.size()) t -= B[i]; // 减去B的当前位C.push_back((t + 10) % 10); // 处理不够减的情况t = t < 0 ? 1 : 0; // 更新借位}// 去前导零while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}

3. 高精度乘低精度(A × b,A ≥ 0,b ≥ 0,b 为 int 型)

讲解思路

  • 模拟人工乘法:从个位开始,逐位与 b 相乘,加上上一位进位,当前位取乘积的个位(t%10),进位取乘积的高位(t/10);
  • 处理边界:遍历 A 的所有位后,若仍有进位,需将进位的每一位依次补到结果末尾。

代码模板

#include <vector>
using namespace std;// C = A × b,A逆序存储,b为低精度整数
vector<int> mul(vector<int> &A, int b) 
{vector<int> C;int t = 0; // 进位,初始为0for (int i = 0; i < A.size() || t; i++){if (i < A.size()) t += A[i] * b;C.push_back(t % 10); // 当前位结果t /= 10; // 更新进位}// 去前导零(如A=0或b=0时)while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}

4. 高精度除低精度(A ÷ b = C ... r,A ≥ 0,b > 0,r 为余数)

讲解思路

  • 模拟人工除法:从高位开始(与加减乘相反),用余数 ×10 加上当前位,当前位商为余数÷b,余数更新为余数%b
  • 处理存储:商的结果是正序存储,需逆序后与其他高精度运算统一格式;
  • 去前导零:删除商的前导零(如 0112→112)。

代码模板

#include <vector>
#include <algorithm>
using namespace std;// A ÷ b = C(商)... r(余数),A逆序存储,C逆序输出
vector<int> div(vector<int> &A, int b, int &r) 
{vector<int> C;r = 0; // 余数,初始为0// 从高位到低位遍历(A逆序存储,高位在末尾)for (int i = A.size() - 1; i >= 0; i--){r = r * 10 + A[i]; // 余数补位 C.push_back(r / b); // 当前位商r %= b; // 更新余数}reverse(C.begin(), C.end()); // 转为逆序存储(与其他运算统一)// 去前导零while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}
http://www.jsqmd.com/news/544493/

相关文章:

  • 【生产环境实录】Mojo嵌入Python解释器时core dump突增300%:我们如何通过LLVM IR层Hook定位并修复内存所有权越界
  • 2025-2026年抗老护肤品推荐:敏感肌温和抗初老口碑产品及用户反馈汇总 - 十大品牌推荐
  • 如何用GPT-4和EEG信号生成文本?Thought2Text技术详解
  • 告别“秃”然!头发稀疏最新解决方案大揭秘 - 品牌测评鉴赏家
  • 脂溢性脱发救星|实测封神的纹发机构,告别油头秃感不踩雷 - 品牌测评鉴赏家
  • CD266 (TWEAKR/Fn14) 靶点技术深度解析:从信号机制到药物研发
  • AB Download Manager终极指南:告别杂乱下载,3步打造高效下载工作流
  • 从像素到坐标:多摄像头三维定位如何把视频变成空间计算引擎?
  • Android13编译内存不足?手把手教你用Swap分区解决Ninja报错137
  • 1Panel v2.0.5及以下版本紧急加固指南:除了升级,这3个临时措施也能防住RCE
  • 微算法科技(NASDAQ:MLGO)后量子区块链安全架构:基于模块化格密码的抗量子签名机制
  • 不用Arduino IDE也能烧录ESP32-CAM?试试这个更简单的工具
  • 二甲双胍与双洛平区别全解析:机制、效果与适用场景 - 品牌排行榜
  • Win11 任务栏Copilot图标消失?三步教你快速恢复
  • 流式清洗新标准:Polars 2.0 Streaming ETL在Kafka-ClickHouse链路中的低延迟落地(端到端<120ms)
  • 2025-2026年抗老护肤品推荐:熬夜肌修护焕亮口碑精华及用户反馈汇总 - 十大品牌推荐
  • 续约落定:安徽智捷与摘星 AI 将合作延续至 2027 - 2026年企业推荐榜
  • 自动化内容审核:OpenClaw+GLM-4.7-Flash的敏感词过滤系统
  • OpenClaw技能开发入门:为Qwen3-VL:30B编写图片翻译插件
  • 避开这些坑!高德DragRoute插件获取路线坐标的5个常见问题解决方案
  • nli-distilroberta-base在Ubuntu20.04上的部署与优化指南
  • 小白也能搞定!用Docker和Halo 2.10搭建个人博客,再也不用担心公网访问问题
  • 2026年开封电脑租赁服务分析,价格便宜且靠谱的品牌推荐 - 工业品网
  • IWR1843毫米波雷达开箱避坑指南:从焊接电源到Demo运行全流程
  • PromeFuzz: A Knowledge-Driven Approach to Fuzzing HarnessGeneration with Large Language Models
  • 百川2-13B模型微调实战:让OpenClaw更好理解你的工作习惯
  • 机器人手臂相机 vs 抓手相机:5个关键区别与选型指南(附避坑技巧)
  • Qwen3-TTS-12Hz-1.7B-CustomVoice惊艳效果:法语浪漫腔调+西班牙语热情语调语音对比
  • XU9232A可穿戴设备 电池供电设备 便携式医疗设备
  • 手把手教你用Buildroot为全志F1C200S定制Linux系统:从交叉编译到根文件系统