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

文章目录

    • 零、前言
    • 一、加法
      • 高精度加法步骤
      • P1601 A+B
    • 二、减法
      • 高精度减法步骤
      • P2142 高精度减法
    • 三、乘法
      • 高精度乘法步骤
      • P1303 A*B
    • 四、除法
      • 高精度除法步骤
      • P1480 A/B
    • 五、高精度快速幂
      • 麦森数

零、前言

高精度运算是某些题目涉及大数值运算且范围超出语言内置类型允许范围时采取的处理手段,原理就是小学列竖式计算的代码化,比较易懂,本文介绍高精度加法、减法、乘法、除法、以及高精度快速幂,附模板即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]) //末位进位,位长+1lc++;
}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]) //前导0lc--;
}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])//前导0lc--;
}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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 数台服务器数台存储阵列柜&#xff0c;共上百块硬盘&#xff0c;划分了数十组lun。 服务器故障&检测&#xff1a; 外部因素导致服务器进水&#xff0c;进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…

从0开始学习C++ 第十三课:结构体和联合体

第十三课&#xff1a;结构体和联合体 学习目标&#xff1a; 理解结构体的基本概念和如何定义结构体。学习如何使用结构体来组织相关数据。了解联合体的概念及其与结构体的不同点。 学习内容&#xff1a; 结构体 概念&#xff1a; 结构体是C中用于表示一组相关数据的复合数据…

Shopee夏季选品策略:吸引消费者,提高销售的10个有效方法

在Shopee平台上进行夏季选品时&#xff0c;卖家需要采取一些策略来吸引消费者并提高销售。本文将介绍十个有效的方法&#xff0c;帮助卖家在夏季市场做好准备&#xff0c;提供符合季节需求的产品&#xff0c;从而提高销售业绩。 先给大家推荐一款shopee知虾数据运营工具知虾免…

Vue-32、Vue单文件组件

1、School.vue <template><h1>{{schoolName}}</h1><h2>{{address}}</h2><button click"showname">点我提示学校名</button> </template> <!----> <script>export default {name: "School",d…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…

C# 实现 希尔密码

希尔密码&#xff08;也称为Hill Cipher&#xff09;是一种经典的对称密码算法&#xff0c;用于加密和解密文本。它由美国数学家莱斯利麦保尔希尔&#xff08;Leslie McBride Hill&#xff09;于1929年提出。 希尔密码基于线性代数和矩阵运算的原理。它将明文划分为若干个长度为…

【Linux工具篇】编辑器vim

目录 vim的基本操作 进入vim(正常模式&#xff09; 正常模式->插入模式 插入模式->正常模式 正常模式->底行模式 底行模式->正常模式 底行模式->退出vim vim正常模式命令集 vim插入模式命令集 vim末行模式命令集 vim操作总结 vim配置 Linux编译器…

如何从软硬件层面优化MySQL?

如何从软硬件层面优化MySQL? 在软件方面&#xff0c;数据库性能取决于很多因素&#xff0c;比如表设计&#xff0c;查询语句以及数据库配置等。在硬件方面&#xff0c;则主要取决于CPU和IO操作。作为一名软件开发者&#xff0c;需要我们从现有的软硬件配置中获得最佳的数据库…

服务器的异步通信——RabbitMQ

目录 一、同步通信 VS 异步通信 二、MQ——消息队列 RabbitMQ RabbitMQ安装 RabbitMQ的整体架构 常见消息模型 基本消息队列&#xff08;BasicQueue&#xff09; 工作消息队列&#xff08;WorkQueue&#xff09; 发布、订阅&#xff08;Publish、Subscribe&#xff0…

CSS文本外观属性内容(知识点1)

知识引入 使用HTML可以对文本外观进行简单的控制&#xff0c;但是效果并不理想&#xff0c;为此CSS提供了一系列的文本外观样式属性&#xff0c;具体如下。 color:文本颜色 color属性用于定义文本的颜色&#xff0c;其取值方式有以下三种。 &#xff08;1&#xff09;预定义…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的&#xff0c;因为爬虫极容易造成两大不合规的问题&#xff1a;一是没有经过个人同意获取数据&#xff0c;二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛&#xff0c;如果企业里有50条未获得授…

前端基础(三十八):iframe通信、浏览器跨窗口通信

iframe通信 - MessageChannel <!-- index.html --> <h3>MessageChannel</h3> <input id"input" type"text" oninput"handleInput(this.value)" /> <hr /> <iframe src"./demo.html"></iframe&…

HCIA——25FTP 的工作原理、功能、TFTP、控制连接、数据连接的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

char const char* 类型的实参与LPCWSTR 类型的形参类型不兼容

点击项目->项目属性 在高级中点击字符集->选择使用多字节字符集 ———————————————————————— 如果还是显示报错&#xff0c;关闭项目&#xff0c;重新进一下项目&#xff0c; 我的当时就是找了好久&#xff0c;都是以上方法&#xff0c;然后重新…

业务连续性演练在软件中的重要性

随着现代社会对信息技术的依赖程度不断增加&#xff0c;软件系统的业务连续性变得至关重要。业务连续性演练成为保障软件系统在各种不可预测情况下能够持续运行的关键措施。本文将探讨业务连续性演练在软件中的重要性以及它为组织提供的价值。 1. 灾难恢复能力的验证 业务连续性…

1 月 22日算法练习

模拟 卡片 题目描述&#xff1a; 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有很多数字卡片&#xff0c;每张卡片上都是数字0到9。小蓝准备用这些卡片来拼一些数&#xff0c;他想从1开始拼出正整数&#xff0c;每拼…

5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展

一、5G与物联网&#xff1a;技术概述与基础 随着科技的飞速发展&#xff0c;第五代移动通信技术&#xff08;5G&#xff09;和物联网&#xff08;IoT&#xff09;已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施&#xff0c;正深刻地改变着人们的生活和…

Open3D 与 Point Cloud 处理

点云基础3D数据结构点云采集方法点云处理框架点云操作 Open3D基础操作 点云基础 3D数据结构 点云&#xff08;Point Cloud&#xff09;&#xff1a; 点云是由一组离散的点构成的三维数据集合&#xff0c;每个点都包含了坐标信息 (x, y, z) 、颜色 (RGB)、类别 (cls)、强度值等…

Windows如何开启telnet

打开控制面板-----点击程序 启用windows功能 勾线telnet