高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

2024-01-24

零、前言

高精度运算是某些题目涉及大数值运算且范围超出语言内置类型允许范围时采取的处理手段,原理就是小学列竖式计算的代码化,比较易懂,本文介绍高精度加法、减法、乘法、除法、以及高精度快速幂,附模板即OJ链接练手。


一、加法

高精度加法步骤

  • 倒序存储加数,低位放数组前面,高位放数组后面(类似小端存储)
  • 低位到高位 ,累加,进位,求余
  • 答案数组从末尾到开头即为高位——低位

P1601 A+B

P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define IOTIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define ll long long
const int N = 505;
int A[N]{0}, B[N]{0}, C[N]{0};
int la, lb, lc;

void add()
{
	//累加、进位、取余
    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]) //末位进位,位长+1
        lc++;
}

int main()
{
    IOTIE
    // freopen("in.txt", "r", stdin);
    string a, b;
    cin >> a >> b, la = a.size(), lb = b.size(), lc = max(la, lb);
    for (int i = 0; i < la; i++)
        A[la - i - 1] = (a[i] ^ 48);
    for (int i = 0; i < lb; i++)
        B[lb - i - 1] = (b[i] ^ 48);
    add();
    for (int i = lc - 1; i >= 0; i--)
        cout << C[i];
    return 0;
}

二、减法

高精度减法步骤

  • 倒序存储加数,低位放数组前面,高位放数组后面(类似小端存储)
  • 被减数A,减数B,如果A < B,交换A,B,输出负号
  • 低位到高位 ,逐位求差,借位,存差
  • 答案数组从末尾到开头即为高位——低位

P2142 高精度减法

P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define IOTIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define ll long long
const int N = 10100;
int A[N]{0}, B[N]{0}, C[N]{0};
int la, lb, lc;

bool cmp()
{
    if (la != lb)
        return la > lb;
    for (int i = la - 1; i >= 0; i--)
        if (A[i] != B[i])
            return A[i] > B[i];
    return true;
}

void sub()
{
    for (int i = 0; i < lc; i++)
    {
        if (A[i] < B[i])//借位
            A[i] += 10, A[i + 1]--;
        C[i] = A[i] - B[i];
    }
    while (lc && !C[lc]) //前导0
        lc--;
}

int main()
{
    IOTIE
    // freopen("in.txt", "r", stdin);
    string a, b;
    cin >> a >> b, la = a.size(), lb = b.size(), lc = max(la, lb);
    for (int i = 0; i < la; i++)
        A[la - i - 1] = (a[i] ^ 48);
    for (int i = 0; i < lb; i++)
        B[lb - i - 1] = (b[i] ^ 48);
    if (!cmp())
        swap(A, B), cout << '-';
    sub();
    for (int i = lc; i >= 0; i--)
        cout << C[i];
    return 0;
}

三、乘法

高精度乘法步骤

  • 倒序存储加数,低位放数组前面,高位放数组后面(类似小端存储)
  • 低位到高位 ,累加乘积,进位,求余
  • 答案数组从末尾到开头即为高位——低位

P1303 A*B

P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define IOTIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define ll long long
const int N = 4010;
int A[N]{0}, B[N]{0}, C[N]{0};
int la, lb, lc;

void mul()
{
    for (int i = 0; i < la; i++)
        for (int j = 0; j < lb; j++)
            C[i + j] += A[i] * B[j], C[i + j + 1] += C[i + j] / 10, C[i + j] %= 10;
    while (lc && !C[lc])//前导0
        lc--;
}

int main()
{
    IOTIE
    // freopen("in.txt", "r", stdin);
    string a, b;
    cin >> a >> b, la = a.size(), lb = b.size(), lc = la + lb;
    for (int i = 0; i < la; i++)
        A[la - i - 1] = (a[i] ^ 48);
    for (int i = 0; i < lb; i++)
        B[lb - i - 1] = (b[i] ^ 48);

    mul();
    for (int i = lc; i >= 0; i--)
        cout << C[i];
    return 0;
}

四、除法

高精度除法步骤

  • 倒序存储加数,低位放数组前面,高位放数组后面(类似小端存储)
  • 高位到低位 ,当前被除数,存商,求余数
  • 答案数组从末尾到开头即为高位——低位

P1480 A/B

P1480 A/B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define IOTIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define ll long long
const int N = 10100;
int A[N]{0}, b, C[N]{0};
int la, lc;

void div()
{
    ll num = 0;
    for (int i = la - 1; i >= 0; i--)
        num = (num << 3) + (num << 1) + A[i], C[i] = num / b, num %= b;
    while (lc && !C[lc])
        lc--;
}

int main()
{
    IOTIE
    // freopen("in.txt", "r", stdin);
    string a;
    cin >> a >> b, la = a.size(), lc = la;
    for (int i = 0; i < la; i++)
        A[la - i - 1] = (a[i] ^ 48);

    div();
    for (int i = lc; i >= 0; i--)
        cout << C[i];
    return 0;
}

五、高精度快速幂

关于二分快速幂: 二分快速幂和快读快写模板【C++】-CSDN博客

其实就是把普通二分快速幂中结果和底数相乘亦即底数自乘的部分换成高精度乘法即可,这里不给出代码只需要替换普通二分快速幂中的乘法为高精度乘法即可,我们直接看一道例题来练手。

麦森数

[P1045 NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

其实就是一个高精度快速幂裸题,由于题目只要求我们最后输出后500位,所以我们高精度乘法的时候只需要进行后500位的计算即可

那么位数如何求呢?

显然存在k ,10^k <= 2^p - 1 < 10^(k + 1)

显然2^p - 1 的位数就是k + 1,而2^p - 1和 2^p的十进制位数相同,那么有

10^k = [2 ^ p],k = p * log10 (2)

我们的位数就是 p * log10 (2) + 1,log10可以用库函数

代码如下:

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define IOTIE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define sc scanf
#define int long long
const int N = 500;
typedef vector<int> VI;
int p;
VI ans(N + 1), a(N + 1);

VI mul(VI &x, VI &y)
{
    VI ret(N + 1);
    for (int i = 0; i < N; i++)
        for (int j = 0; j + i < N; j++)
            ret[i + j] += x[i] * y[j], ret[i + j + 1] += ret[i + j] / 10, ret[i + j] %= 10;

    return ret;
}
void quickpower()
{
    ans[0] = 1, a[0] = 2;
    while (p)
    {
        if (p & 1)
            ans = mul(ans, a);
        a = mul(a, a), p >>= 1;
    }
    ans[0]--;
}
signed main()
{
    IOTIE
    // freopen("in.txt", "r", stdin);
    cin >> p;
    cout << floor(p * log10(2) + 1) << '\n';
    quickpower();
    for (int i = 499; i >= 0; i--)
    {
        cout << ans[i];
        if ((500 - i) % 50 == 0)
            cout << '\n';
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高精度运算合集,加减乘除,快速幂,详细代码,OJ链接 的相关文章

  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • Microsoft Graph API 授权错误:无效受众

    我知道这是一个很长的问题 但如果有人能与我分享他们的想法或经验 我真的很感激 因为我已经解决这个问题几天了 现在正在尝试很多事情 我有一个 ASP Net Core 3 1 Web API 应用程序和一个 ASP NET Core 3 1
  • 在运行时配置 ASP.NET 会话状态

    我们有一个使用 SQL Server 会话状态的 ASP NET 网站 状态配置在Web config like
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • std::atomic 是否会阻止非原子变量对原子变量进行重新排序

    问题很简单 问 如果我有 settings N STNGS used by many threads std atomic
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 宏中 do { } while(0) 与 ({ }) 的优点?

    Stack Overflow 上有很多关于使用的问题do while 0 在宏中 但这有点不同 我明白为什么do while 0 用于将多行代码包装在宏扩展中 但我经常看到另一种形式 The form 的优点是它是一个表达式并且可以有 返回
  • 使用本地系统帐户运行时,GetAccessControl 方法失败,出现意外错误代码 3

    我已经创建了 Windows 服务并使用本地系统帐户运行它 该服务正在读取用户文件并查找其所有者 在获取文件的访问权限以查找所有者时 它抛出以下异常 方法失败 出现意外错误代码 3 StackTrace 在 System Security
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • GridView,在代码中添加标题行第 2 部分

    这是这篇文章的延续 但添加了完整的代码 ASP NET GridView 在代码中添加标题行 https stackoverflow com questions 19119004 asp net gridview adding header
  • C# - 平移光标

    我正在 PictureBox 控件中实现大图像的平移 并且设置适当的方向平移光标没有问题 但是 我似乎找不到用于平底锅原点的图像 内部带有箭头的圆圈 我在哪里可以找到它 我觉得image您正在寻找的内容未包含在框架中 每个应用程序都使用自己
  • 如何在 C++ 中打印变量的名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中获取变量名称的编程方法 https stackoverflow com questions 1623111 programmatic way to get variable name in c

随机推荐

  • 【安全】原型链污染 - Hackit2018

    目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下 然后可以试着访问一下 报错是因为里面没内容而已 不影响 准备工作就做好了 解题 代码审计 const express require exp
  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D
  • 【UE】在控件蓝图中通过时间轴控制材质参数变化

    效果 步骤 1 新建一个控件蓝图和一个材质 2 打开材质 设置材质域为用户界面 混合模式设置为 半透明 在材质图表中添加两个参数来控制材质的颜色和不透明度 3 对材质创建材质实例 4 打开控件蓝图 在画布面板中添加一个图像控件 将刚才创建的
  • 案例研究:YGG 如何通过 GAP 帮助 Pixels 扩大玩家群体

    在 Sky Mavis 联合创始人 Jeffrey Jihoz Zirlin 在 YGG Web3 游戏峰会 W3GS 上发表主题演讲时 他向在场的人们透露 MMO 农场游戏 Pixels 的日活跃用户数已经超过了 130 000 人 这使
  • logback配置xml日志文件(保姆级教程)

    前言 这是个啥 这就是个控制日志输出格式 控制日志输出位置 控制日志输出环境 控制日志输出级别的玩意 控制忽略输出的日志就这些功能 没有什么很复杂的东西 废话不说多了 配置介绍 configuration
  • 题解 | #二维数组中的查找#C++二维数组暴力解法

    试用期被裁概率大嘛 华为西安 三一 在电信工作可以躺平吗 选offer 2022届offer收割机手把手教你拿offer 面试篇 新媒体运营面试的常问题都整理出来啦 还是准备辞职了 感觉我真的不适合上班 攒了点钱 准备辞职了 后面也不打算再
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩
  • Android开发--自定义时频域折线绘制图

    直接上干货 1 XML
  • Kafka速度之谜:高性能的幕后秘密大揭秘

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 kafka高性能的原因 Page Cache ZeroCopy 零拷贝 前言 Kafka的介绍 kafka是linkedIn开源的分布式消息系统 归给Ap
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • 自动驾驶离不开的仿真!Carla-Autoware联合仿真全栈教程

    随着自动驾驶技术的不断发展 研发技术人员开始面对一系列复杂挑战 特别是在确保系统安全性 处理复杂交通场景以及优化算法性能等方面 这些挑战中 尤其突出的是所谓的 长尾问题 即那些在实际道路测试中难以遇到的罕见或异常驾驶情况 这些问题暴露了实车
  • 题解 | #翻转单词序列# 复习Java几个集合方法使用

    人生第一次面试gg 字节跳动 复活赛 二面 字节后端实习面试 字节飞书后端一面凉经 字节 客服平台 一面面经 已挂 菜鸟前端 避雷避雷中华财险 中厂大厂到底怎么选 樊登读书精准营销岗面经 跨行 转技术岗进大厂的好机会 来看 岗位名称 云 软
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 两个月进口猛增10倍,买近百台光刻机,难怪ASML不舍中国市场

    据统计数据显示 2023年11月和12月 中国从荷兰进口的光刻机设备同比猛增10倍 进口金额超过19亿美元 让ASML赚得盆满钵满 ASML早前表示中国客户在2023年订购的光刻机全数交付 2023年11月中国进口的光刻机达到42台 进口金
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

    文章目录 零 前言 一 加法 高精度加法步骤 P1601 A B 二 减法 高精度减法步骤