C/C++高精度运算(大整数运算)详细讲解

C/C++高精度运算(大整数运算)详细讲解

简介

在进行高精度运算时,我们需要使用到很大的整数进行计算,如:1000的阶乘,1到1000的和等。而C/C++默认的整型数据类型一般只能存储到2^32-12^64-1这样的范围,需要我们使用数组或链表等结构来存储这类大数。本篇文章将详细介绍如何使用C/C++实现大整数和高精度运算。

实现方式

在C/C++中,大整数可以使用数组或链表来存储。我们通常使用数组来存储,每一位数字对应数组中的一个元素,最高位在数组的最前面。在进行高精度运算的过程中,需要注意进位和补零等情况。

加法

我们通常采用逐位相加的方法进行高精度加法。依次计算每一位的和,并且考虑到进位情况。

以下是C++代码示例:

vector<int> add(vector<int> a, vector<int> b) {
    vector<int> c;
    int t = 0; //进位
    for (int i = 0; i < a.size() || i < b.size() || t; i++) {
        if (i < a.size()) t += a[i];
        if (i < b.size()) t += b[i];
        c.push_back(t % 10); //将当前位数字存入结果数组中
        t /= 10; //更新进位状态
    }
    return c;
}

其中,vector是标准库中的动态数组容器,可变长数组,可以通过push_back方法在末尾添加元素。

减法

我们通常采用逐位相减的方法进行高精度减法。依次计算每一位的差,并且考虑借位情况。

以下是C++代码示例:

vector<int> sub(vector<int> a, vector<int> b) {
    vector<int> c;
    int t = 0; //借位
    for (int i = 0; i < a.size(); i++) {
        t = a[i] - t;
        if (i < b.size()) t -= b[i];
        c.push_back((t + 10) % 10); //将当前位数字存入结果数组中
        if (t < 0) t = 1; else t = 0; //更新借位状态
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back(); //删除前导零
    return c;
}

乘法

我们采用逐位相乘的方法进行高精度乘法。将一个数的每一位都分别与另一个数相乘,再将结果相加即可。

以下是C++代码示例:

vector<int> mul(vector<int> a, int b) {
    vector<int> c;
    int t = 0; //进位
    for (int i = 0; i < a.size() || t; i++) {
        if (i < a.size()) t += a[i] * b;
        c.push_back(t % 10); //将当前位数字存入结果数组中
        t /= 10; //更新进位状态
    }
    return c;
}

除法

我们采用逐位除法的方法进行高精度除法。将每一位的商都算出来,并且考虑到余数的情况。

以下是C++代码示例:

vector<int> div(vector<int> a, int b, int& r) {
    vector<int> c;
    r = 0; //余数
    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;
}

取余

取余运算与除法运算相似,只需要返回余数即可。

以下是C++代码示例:

int mod(vector<int> a, int b) {
    int r = 0; //余数
    for (int i = a.size() - 1; i >= 0; i--) {
        r = r * 10 + a[i];
        r %= b; //更新余数状态
    }
    return r;
}

示例

我们可以用高精度运算来计算1000的阶乘和1到1000的和。

#include <iostream>
#include <vector>
using namespace std;

vector<int> mul(vector<int> a, vector<int> b) { //高精度乘法
    vector<int> c(a.size() + b.size());
    for (int i = 0; i < a.size(); i++)
        for (int j = 0; j < b.size(); j++)
            c[i + j] += a[i] * b[j];
    for (int i = 0; i < c.size() - 1; i++) { //进位
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back(); //删除前导零
    return c;
}

vector<int> add(vector<int> a, vector<int> b) { //高精度加法
    vector<int> c;
    int t = 0; //进位
    for (int i = 0; i < a.size() || i < b.size() || t; i++) {
        if (i < a.size()) t += a[i];
        if (i < b.size()) t += b[i];
        c.push_back(t % 10);
        t /= 10;
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back(); //删除前导零
    return c;
}

int main() {
    vector<int> res(1, 1); //res初始为1
    for (int i = 1; i <= 1000; i++) { //计算阶乘
        vector<int> p;
        int t = i;
        while (t) { //将i转换为数组
            p.push_back(t % 10);
            t /= 10;
        }
        if (p.empty()) p.push_back(0); //防止空数组
        res = mul(res, p);
    }
    int sum = 0;
    for (int i = 1; i <= 1000; i++) { //计算和
        vector<int> p;
        int t = i;
        while (t) { //将i转换为数组
            p.push_back(t % 10);
            t /= 10;
        }
        if (p.empty()) p.push_back(0); //防止空数组
        res = add(res, p);
    }
    reverse(res.begin(), res.end()); //翻转数组
    for (int i = 0; i < 10; i++) { //输出前10位
        cout << res[i];
    }
    cout << endl;
    return 0;
}

总结

本篇文章介绍了C/C++实现高精度运算的方法,并给出了加法、减法、乘法、除法和取余的函数实现示例。我们可以利用高精度运算计算大数的阶乘、和等复杂运算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++高精度运算(大整数运算)详细讲解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 最终幻想14极风神打法攻略 奶视角

    最终幻想14极风神打法攻略 奶视角 背景介绍 极风神是最终幻想14游戏中的一项高级难度挑战,需要有很强的装备和配合默契的团队才能成功打倒。本攻略以奶视角为主,重点讲解了在战斗过程中如何发挥奶妈的治疗作用,保证了团队充沛的血量和强力的输出,从而战胜了这么难的BOSS。 视频介绍 在下面的视频中,你可以看到我们的团队是如何通过配合打败极风神的。视频有详细的解说,…

    C 2023年5月22日
    00
  • C语言小程序 如何判断三角型类型

    要判断一个三角形的类型,需要先知道这个三角形的三边长度。以下是完整攻略: 首先,需要从用户处获取三角形的三条边长,可以采用以下代码读取用户输入的三边: double a, b, c; scanf("%lf%lf%lf", &a, &b, &c); 接下来,需要判断输入的边长是否可以组成三角形。可以用以下代码来实现:…

    C 2023年5月23日
    00
  • C语言socket编程开发应用示例

    下面是关于C语言Socket编程开发应用示例的完整攻略: 什么是Socket编程? Socket是计算机网络通信中的一种方式,它定义了两个网络应用程序之间的通信规则。Socket编程是指利用Socket进行网络编程,实现网络通信的一种技术。 Socket编程的基础知识 Socket编程主要有两个重要的函数:socket()和bind()。其中,socket(…

    C 2023年5月22日
    00
  • C程序 确定给定索引的Unicode代码点

    C程序确定给定索引的Unicode代码点 简介 Unicode 是一种世界性的字符编码标准,它描述了世界上大多数字符的对应关系。在 C 程序中,我们可以通过给定索引来确定对应的 Unicode 代码点。 函数原型 int32_t ucp(uint32_t index); 函数原型中,参数 index 代表要查询的索引,返回值为对应的 Unicode 代码点。…

    C 2023年5月9日
    00
  • C语言职工信息管理系统源码

    C语言职工信息管理系统源码完整攻略 简介 C语言职工信息管理系统源码是一套基于C语言编写的职工信息管理系统。该系统可以方便地实现职工的添加、删除、修改和查询等基本操作,并且提供了良好的用户界面,用户可以通过该系统轻松管理职工信息。 功能模块 C语言职工信息管理系统源码包含了以下几个模块: 主菜单模块:用于显示主菜单和处理用户输入。 增加职工模块:用于增加新的…

    C 2023年5月23日
    00
  • C++11并发编程关于原子操作atomic的代码示例

    首先,为了保证代码并发时的正确性和可靠性,C++提供了原子操作atomic,它允许程序员指定特定的操作符进行原子操作。本文将详细讲解使用C++11原子操作的代码示例以及相关的攻略。 原子操作atomic 原子操作atomic是一种保证并发编程安全的工具,在多线程的情况下,可以保证一些关键代码块执行过程中的原子操作。原子操作可以避免竞态条件(Race Cond…

    C 2023年5月22日
    00
  • C++机房预约系统实现流程实例

    C++机房预约系统实现流程实例 本篇文章介绍如何使用C++实现一个机房预约系统。详细步骤如下: 1. 界面设计 首先,需要设计预约系统的界面。可以选择命令行界面和图形界面,这里选择命令行界面。 2. 系统功能 接下来,需要确定系统需要实现的功能。这里考虑以下几点: 订单管理:包括添加预约、取消预约和显示预约信息。 学生管理:包括添加学生、修改学生和删除学生。…

    C 2023年5月23日
    00
  • boost.asio框架系列之buffer函数

    Boost.Asio框架系列之buffer函数 在Boost.Asio框架中,boost::asio::buffer()函数的主要作用是创建一个缓冲区,以便在套接字(Socket)和其他数据源之间传输数据。在进行异步操作时,使用缓冲区管理和传输数据是很常见的。boost::asio::buffer()函数支持很多不同的数据类型,它支持以下数据类型: 基础数据…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部