详解C/C++高精度(加减乘除)算法中的压位优化

详解C/C++高精度(加减乘除)算法中的压位优化

什么是高精度算法?

高精度算法(又叫大数算法)是指可以处理比计算机支持的最大数值范围更大的数值计算方法。在C/C++中,int类型变量的最大范围一般为2^31-1即2147483647,而long long型变量的最大范围一般为2^63-1即9223372036854775807。如果需要处理比这更大的数字,则无法使用普通的数据类型进行计算,需要使用高精度算法来处理。

为什么需要压位优化?

高精度算法是通过将大数拆分成若干个小数的方式来进行计算的。例如,“12345678901234567890”可以拆分成“1234567890”和“1234567890”,然后进行逐位相加或相乘,得出最终答案。这种拆分操作会产生很多的进位(或借位)操作,导致算法效率不高。而压位优化则可以有效降低进位(或借位)的次数,提高算法效率。

压位优化的具体实现方法

压位优化的实现方法比较简单,只需要将高精度算法中的拆分操作重新定义,使得可以同时处理更多位数的数字。具体来说,可以先将高精度数值按照32位(或64位)一组进行划分,再进行计算。

具体实现方法可以参考以下代码:

#include <bits/stdc++.h>
using namespace std;

const int BASE = 1000000000;
const int WIDTH = 9;

typedef long long ll;

struct BigInt {
    vector<int> s;

    BigInt& clean() {while(!s.back() && s.size() > 1) s.pop_back(); return *this;}

    BigInt(ll num = 0) {*this = num;}
    BigInt(string s) {*this = s;}

    BigInt& operator = (long long num) {
        s.clear();
        do {
            s.push_back(num % BASE);
            num /= BASE;
        } while (num > 0);
        return *this;
    }

    BigInt& operator = (const string& str) {
        s.clear();
        int x, len = (str.length() - 1) / WIDTH + 1;
        for (int i = 0; i < len; i++) {
            int end = str.length() - i*WIDTH;
            int start = max(0, end - WIDTH);
            sscanf(str.substr(start,end-start).c_str(), "%d", &x);
            s.push_back(x);
        }
        return (*this).clean();
    }

    BigInt operator + (const BigInt& b) const {
        BigInt c;
        c.s.clear();
        for (int i = 0, g = 0; ; i++) {
            if (g == 0 && i >= s.size() && i >= b.s.size()) break;
            int x = g;
            if (i < s.size()) x += s[i];
            if (i < b.s.size()) x += b.s[i];
            c.s.push_back(x % BASE);
            g = x / BASE;
        }
        return c;
    }

    BigInt operator * (const BigInt& b) const {
        vector<ll> num(s.size()+b.s.size(), 0);
        for (int i = 0; i < s.size(); i++)
            for (int j = 0; j < b.s.size(); j++)
                num[i+j] += (ll)s[i] * b.s[j];

        BigInt c;
        c.s.clear();
        for (int i = 0, g = 0; ; i++) {
            if (g ==0 && i >= num.size()) break;
            ll x = num[i] + g;
            c.s.push_back(x % BASE);
            g = x / BASE;
        }
        return c.clean();
    }

    // ...

};

int main() {
    BigInt a, b, c;
    a = "1234567890123456789012345678901234567890";
    b = "1098765432109876543210987654321098765432109876543210";
    c = a + b;
    cout << c << endl;
    return 0;
}

在以上代码中,对高精度数字的拆分操作被重新定义为32位的数字组,在进行加法和乘法操作时,可以同时处理更多的位数,降低进位和借位的次数,提高算法效率。

示例说明

以下是使用以上代码进行加法运算的示例:

BigInt a, b, c;
a = "1234567890123456789012345678901234567890";
b = "1098765432109876543210987654321098765432109876543210";
c = a + b;
cout << c << endl;

以上代码中,首先声明了三个BigInt类型的变量a、b、c,并通过字符串的方式将大数赋值给a和b。然后通过c = a + b的方式进行加法操作,最终输出结果。由于使用了压位优化,计算速度比普通的高精度算法要快很多。

另外一个使用压位优化进行高精度乘法的示例代码如下:

BigInt a, b, c;
a = "1234567890123456789012345678901234567890";
b = "1098765432109876543210987654321098765432109876543210";
c = a * b;
cout << c << endl;

以上代码中,同样使用了压位优化的乘法函数,可以同时处理更多的位数,提高计算效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C/C++高精度(加减乘除)算法中的压位优化 - Python技术站

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

相关文章

  • C语言示例代码讲解栈与队列

    下面是关于“C语言示例代码讲解栈与队列”的完整攻略: 一、栈和队列的概念 栈和队列都是常用的数据结构,他们都是线性结构,但是他们在元素的插入和删除的方法以及相应的顺序限制上是有区别的。栈是一种“后进先出”的数据结构,也就是最后放入的元素最先被取出;而队列是一种“先进先出”的数据结构,也就是最先放入的元素最先被取出。 二、栈和队列的实现 1. 栈的实现 栈可以…

    C 2023年5月24日
    00
  • C++操作json文件以及jsoncpp配置详解

    首先我们来讲解一下C++如何操作JSON文件。JSON是一种轻量级数据交换格式,通常用于前后端数据交互。而JSON格式的数据在C++中可以通过JSONCPP库进行解析和操作。下面是操作JSON文件的完整攻略: 1. 安装jsoncpp库 在进行JSON格式的数据操作之前,需要先下载安装jsoncpp库。在Windows平台上,可以在官网(https://gi…

    C 2023年5月23日
    00
  • 详解iOS通过ASIHTTPRequest提交JSON数据

    下面是详解iOS通过ASIHTTPRequest提交JSON数据的完整攻略: 1. 准备工作 在使用ASIHTTPRequest来提交JSON数据之前,需要先将ASIHTTPRequest集成到项目中。可以使用CocoaPods或手动下载并导入ASIHTTPRequest文件夹。 2. 导入ASIHTTPRequest头文件 在需要使用ASIHTTPRequ…

    C 2023年5月23日
    00
  • C#简单快速的json组件fastJSON使用介绍

    C#简单快速的json组件fastJSON使用介绍 简介 fastJSON是一个快速、小巧且易于使用的JSON序列化和反序列化库,与JSON.NET等流行的JSON库相比,在一些简单的场景下,fastJSON可以提供更高的性能。fastJSON支持将任何.NET对象序列化为JSON字符串,同时还支持将JSON字符串反序列化为.NET对象。 安装 使用NuGe…

    C 2023年5月23日
    00
  • C++析构函数内部工作机制详解

    C++析构函数内部工作机制详解 概述 在C++中,析构函数是一种特殊的成员函数,当一个对象的生命周期结束时会自动调用其析构函数进行清理工作。本文将详细讲解C++析构函数的内部工作机制。 析构函数的定义 析构函数与构造函数类似,但其函数名前需要加上一个波浪线“~”,例如: ~ClassName() {} 我们可以在析构函数中清理对象的动态分配资源和释放占用的内…

    C 2023年5月23日
    00
  • 操作系统中的Hosts文件工作原理和作用及其详细介绍

    操作系统中的Hosts文件工作原理和作用及其详细介绍 Hosts文件介绍 在计算机网络中,Hosts文件是一个用于存储 IP 地址和主机名(域名)对应关系的纯文本文件,通常位于操作系统的系统目录下,在 Windows 系统中为 C:\Windows\System32\drivers\etc\hosts 文件。该文件是本地DNS的重要组成部分,可以将特定的主机…

    C 2023年5月23日
    00
  • python访问纯真IP数据库的代码

    Python访问纯真IP数据库的代码完整攻略 纯真IP数据库是一款用于IP地址查询的软件,可以通过输入一个IP地址来查询对应的区域、省份、城市等信息。在Python中,可以通过访问纯真IP数据库来实现这一功能。下面是实现该功能的完整攻略。 步骤一:下载纯真IP数据库 首先需要从纯真官网下载最新版纯真IP数据库,下载后,解压压缩包,可以得到一个名为“QQWry…

    C 2023年5月23日
    00
  • 解决偶现的MissingServletRequestParameterException异常问题

    当我们在使用SpringMVC进行开发时,有时会碰到MissingServletRequestParameterException异常,这是因为我们在控制层方法的参数列表中注入了一个参数,但在请求的参数中却找不到该参数导致的。下面是解决该问题的完整攻略: 1. 确认请求参数名称与方法参数名称是否一致 当我们在控制层方法的参数列表中声明了一个参数,例如以下代码…

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