跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

高精度算法详解:大整数加减乘除实现与原理

高精度算法用于解决标准数据类型无法存储的超大数值计算问题。通过将数字转为字符串并逆序存入数组,模拟小学列竖式过程实现加减乘除。加法需处理进位,减法需比较大小及借位,乘法采用无进位相乘后统一进位,除法针对高精除以低精场景逐位计算。代码示例涵盖各运算模板,重点在于边界条件与前导零的处理。

kaikai发布于 2026/3/26更新于 2026/10/1982 浏览
高精度算法详解:大整数加减乘除实现与原理

高精度算法详解

当数值超出标准整型范围(如 long long)时,我们需要使用高精度算法。本质上,这是用代码模拟小学列竖式计算的过程。

一、核心思路

所有高精度运算都遵循一个基本模式:

  1. 读入:使用字符串接收数字。
  2. 存储:将每一位数字逆序存入数组(下标 0 存个位),方便从低位开始计算。
  3. 运算:按位模拟加减乘除逻辑。
  4. 输出:逆序打印数组内容。

二、高精度加法

题目背景

处理两个超大整数的相加,例如 A + B。

实现细节

模拟竖式加法,从最低位开始逐位相加,并处理进位。

#include<iostream>
using namespace std;

const int N = 1e6 + 10;
int a[N], b[N], c[N];
int la, lb, lc;

void add(int a[], int b[], int c[]) {
    for (int i = 0; i < lc; i++) {
        c[i] += a[i] + b[i];      // 对应位相加
        c[i + 1] += c[i] / 10;    // 处理进位
        c[i] %= 10;               // 保留当前位
        if (c[lc]) lc++;          // 更新长度
    }
}

int main() {
    string x, y;
    cin >> x >> y;
    la = x.size();
    lb = y.size();
    lc = max(la, lb);
    
    // 逆序存储
    for (int i = 0; i < la; i++) a[la - i - 1] = x[i] - '0';
    for (int i = 0; i < lb; i++) b[lb - i - 1] = y[i] - '0';
    
    add(a, b, c);
    for (int i = lc - 1; i >= 0; i--) cout << c[i];
    return 0;
}

注意:这里逆序存储是为了让数组下标 0 对应个位,这样进位可以直接加到 i+1 位置,符合自然计算习惯。

三、高精度减法

题目背景

计算 A - B,需确保被减数大于等于减数。

实现细节

  1. 比较大小:先比较位数,位数相同则按字典序比较。
  2. 借位处理:若某一位不够减,向高位借 1 当 10。
  3. 前导零:结果可能产生前导零,需去除。
#include<iostream>
using namespace std;

const int N = 1e6 + 10;
int a[N], b[N], c[N];
string x, y;
int la, lb, lc;

bool cmp(string& x, string& y) {
    if (x.size() != y.size()) return x.size() < y.size();
    return x < y;
}

void sub(int c[], int a[], int b[]) {
    for (int i = 0; i < lc; i++) {
        c[i] += a[i] - b[i];
        if (c[i] < 0) {
            c[i + 1] -= 1;  // 向高位借位
            c[i] += 10;
        }
    }
    while (lc > 1 && c[lc - 1] == 0) lc--; // 去除前导零
}

int main() {
    cin >> x >> y;
    if (cmp(x, y)) {
        swap(x, y);
        cout << '-';
    }
    la = x.size();
    lb = y.size();
    lc = max(la, lb);
    
    for (int i = 0; i < la; i++) a[la - i - 1] = x[i] - '0';
    for (int i = 0; i < lb; i++) b[lb - i - 1] = y[i] - '0';
    
    sub(c, a, b);
    for (int i = lc - 1; i >= 0; i--) cout << c[i];
    return 0;
}

四、高精度乘法

题目背景

计算 A * B,通常涉及一个大整数乘以另一个大整数。

实现细节

采用'无进位相乘再统一进位'的策略,类似竖式乘法中每一行错位累加的过程。

#include<iostream>
using namespace std;

const int N = 1e5 + 10;
int a[N], b[N], c[N];
string x, y;
int la, lb, lc;

void mul(int c[], int a[], int b[]) {
    // 无进位相乘,然后相加
    for (int i = 0; i < la; i++) {
        for (int j = 0; j < lb; j++)
            c[i + j] += a[i] * b[j];
    }
    
    // 统一处理进位
    for (int i = 0; i < lc; i++) {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    
    while (lc > 1 && c[lc - 1] == 0) lc--;
}

int main() {
    cin >> x >> y;
    la = x.size();
    lb = y.size();
    lc = la + lb;
    
    for (int i = 0; i < la; i++) a[la - i - 1] = x[i] - '0';
    for (int i = 0; i < lb; i++) b[lb - i - 1] = y[i] - '0';
    
    mul(c, a, b);
    for (int i = lc - 1; i >= 0; i--) cout << c[i];
    return 0;
}

五、高精度除法

题目背景

此处特指「高精度除以低精度」,即大整数除以普通整数。

实现细节

模拟手算除法,从高位到低位逐位试商。

#include<iostream>
using namespace std;

const int N = 1e6 + 10;
typedef long long LL;
int a[N], b, c[N];
string x;
int la;

void div(int c[], int a[], int b) {
    LL t = 0;
    for (int i = la - 1; i >= 0; i--) {
        t = t * 10 + a[i];      // 当前被除数
        c[i] = t / b;           // 记录商
        t %= b;                 // 余数留给下一位
    }
    while (la > 1 && c[la - 1] == 0) la--; // 去除前导零
}

int main() {
    cin >> x >> b;
    la = x.size();
    for (int i = 0; i < la; i++) a[la - i - 1] = x[i] - '0';
    
    div(c, a, b);
    for (int i = la - 1; i >= 0; i--) cout << c[i];
    return 0;
}

总结

高精度算法的核心在于将大数拆解为数组元素,通过模拟人工计算流程来突破数据类型限制。关键点包括:

  • 存储方式:逆序存储便于进位和借位操作。
  • 边界处理:务必检查前导零和空值情况。
  • 复杂度:通常为 O(N),N 为数字位数。

掌握这些模板后,面对大数运算问题即可从容应对。

目录

  1. 高精度算法详解
  2. 一、核心思路
  3. 二、高精度加法
  4. 题目背景
  5. 实现细节
  6. 三、高精度减法
  7. 题目背景
  8. 实现细节
  9. 四、高精度乘法
  10. 题目背景
  11. 实现细节
  12. 五、高精度除法
  13. 题目背景
  14. 实现细节
  15. 总结

更多推荐文章

查看全部
  • 阿里巴巴开源推理模型 Marco-o1 与多模态 MoE 大模型 Awaker2.5-VL 解析
  • 基于 AI 快速开发 MCP 服务插件及部署测试指南
  • 基于 FPGA 的千兆网 GigE Vision 视频传输方案实现(A7/K7 实战)
  • 多模型 AI 协同技巧:整合 ChatGPT、Claude 与 MCP 实现高效工作流
  • Unreal Engine 4.27 结合 AirSim 搭建澳洲农村无人机仿真环境
  • OpenClaw 手机端部署与 AI 自动化应用实践
  • 二叉树深度计算与先序序列重构算法解析
  • IPIDEA 网页抓取 API 实战:eBay 商品数据采集与 Python 接入
  • Flutter 组件 tavily_dart 在鸿蒙 Harmony 上的适配与 AI 搜索集成实战
  • AI 文本生成算法详解:从 LSTM 到 Transformer
  • 5 款免费跨平台 SSH 工具横评:连接稳定性与功能对比
  • AMD显卡llama.cpp Vulkan后端兼容性问题与部署指南
  • Llama-2-7b 在昇腾 NPU 上的六大核心场景性能基准
  • OpenClaw Gateway 常见问题与配置指南
  • 2025 中秋月相计算与月球数据可视化实战
  • Python 零基础自学教程
  • 常见机器学习算法原理:线性回归、决策树、SVM 与聚类
  • OpenDroneMap 无人机影像三维重建:安装与实战指南
  • 网络安全行业发展前景与零基础转行建议
  • VS Code Java 扩展插件 JDK 版本报错解决方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online