LevOJ.sln - 第四期

news/2025/3/28 20:14:25/文章来源:https://www.cnblogs.com/churk/p/18784438

LevOJ平台.sln

高精度运算模板

描述

P1120 P1121 P1134 P1136 P1139 P1155 P2025 P2102 P2103

其中P1139 需要优化高精乘法,其他题目都可以套公式。

苯蒟蒻也没系统学过算法,群佬有更高级的算法一定要在评论区贴一下喵~

模板

// 高精度模板
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;int compare(string a, string b)
{while (a.size() > 1 && a[0] == '0')a.erase(0, 1);while (b.size() > 1 && b[0] == '0')b.erase(0, 1);if (a.size() > b.size())return 1;if (a.size() < b.size())return -1;for (size_t i = 0; i < a.size(); ++i){if (a[i] > b[i])return 1;if (a[i] < b[i])return -1;}return 0;
}// 将字符串逆序存储到数组中
vector<int> adjust(string x)
{vector<int> res;for (int i = x.size() - 1; i >= 0; i--)res.push_back(x[i] - '0');return res;
}// 大整数除二
string div2(const string &x)
{string res;int carry = 0;for (int i = 0; i < (int)x.size(); i++){int d = x[i] - '0' + carry;res += (d / 2) + '0';carry = (d % 2) * 10;}size_t pos = res.find_first_not_of('0');if (pos != string::npos)return res.substr(pos);elsereturn "0";
}// 高精度加法
string add(string a, string b, int scale)
{vector<int> A, B;vector<char> C;A = adjust(a);B = adjust(b);int carry = 0;for (int i = 0; i < (int)A.size() || i < (int)B.size(); i++){if (i < (int)A.size())carry += A[i];if (i < (int)B.size())carry += B[i];C.push_back((char)(carry % scale) + '0');carry /= scale;}if (carry)C.push_back((char)carry + '0');reverse(C.begin(), C.end());return string(C.begin(), C.end());
}// 高精度减法
string sub(string a, string b, int scale)
{vector<int> A, B;vector<char> C;A = adjust(a);B = adjust(b);if (compare(a, b) < 0){swap(A, B);C.push_back('-');}int borrow = 0;for (int i = 0; i < (int)A.size(); i++){int diff = A[i] - borrow;if (i < (int)B.size())diff -= B[i];if (diff < 0){diff += scale;borrow = 1;}elseborrow = 0;C.push_back('0' + diff);}while (C.size() > 1 && C.back() == '0')C.pop_back();if (C[0] == '-')reverse(C.begin() + 1, C.end());elsereverse(C.begin(), C.end());return string(C.begin(), C.end());
}// 高精度乘法
string mul(string a, string b, int scale)
{vector<int> A, B;vector<char> C;A = adjust(a);B = adjust(b);vector<int> res(A.size() + B.size(), 0);for (int i = 0; i < (int)A.size(); i++){for (int j = 0; j < (int)B.size(); j++){res[i + j] += A[i] * B[j];res[i + j + 1] += res[i + j] / scale;res[i + j] %= scale;}}for (int i = (int)res.size() - 1; i >= 0; i--)C.push_back((char)(res[i] % scale) + '0');reverse(C.begin(), C.end());while (C.size() > 1 && C.back() == '0')C.pop_back();reverse(C.begin(), C.end());return string(C.begin(), C.end());
}// 高精度阶乘
string fac(int n)
{string C;C.push_back('1');for (int i = 2; i <= n; i++){string temp = mul(C, to_string(i), 10);C = temp;}return C;
}// 高精度取模
string mod(string a, string b, int scale)
{vector<int> A, B;vector<char> C;A = adjust(a);B = adjust(b);while (compare(a, b) >= 0){a = sub(a, b, scale);}return a;
}// 高精度快速幂
string pow(string a, string b)
{string C = "1";while (!b.empty() && b != "0"){if ((b.back() - '0') % 2 == 1)C = mul(C, a, 10);a = mul(a, a, 10);b = div2(b);}return C;
}// 高精度浮点数加法
string fadd(string a, string b)
{string Ai = "0", Bi = "0", Af = "0", Bf = "0", Ci, Cf;size_t pos;pos = a.find('.');if (pos != string::npos){Ai = a.substr(0, pos);Af = a.substr(pos + 1, a.size() - pos - 1);}elseAi = a;pos = b.find('.');if (pos != string::npos){Bi = b.substr(0, pos);Bf = b.substr(pos + 1, b.size() - pos - 1);}elseBi = b;int m = max(Af.size(), Bf.size());Af.insert(Af.end(), m - Af.size(), '0');Bf.insert(Bf.end(), m - Bf.size(), '0');Cf = add(Af, Bf, 10);int carry = 0;if ((int)Cf.size() > m){carry = 1;Cf = Cf.substr(1);}Ci = add(Ai, Bi, 10);Ci = add(Ci, to_string(carry), 10);if (Ci.size() > 1 && Ci[0] == '0')Ci.erase(0, Ci.find_first_not_of('0'));while (Cf.size() > 1 && Cf.back() == '0')Cf.pop_back();return Ci + "." + Cf;
}// 高精度浮点数减法
string fsub(string a, string b)
{string Ai, Bi, Af = "0", Bf = "0", Ci, Cf;size_t pos;int neg = 0;pos = a.find('.');if (pos != string::npos){Ai = a.substr(0, pos);Af = a.substr(pos + 1, a.size() - pos - 1);}elseAi = a;pos = b.find('.');if (pos != string::npos){Bi = b.substr(0, pos);Bf = b.substr(pos + 1, b.size() - pos - 1);}elseBi = b;if (compare(Ai, Bi) < 0){swap(Ai, Bi);swap(Af, Bf);neg = 1;}int m = max(Af.size(), Bf.size());Af.insert(Af.end(), m - Af.size(), '0');Bf.insert(Bf.end(), m - Bf.size(), '0');Af.insert(Af.begin(), 1, '1');Cf = sub(Af, Bf, 10);int borrow = 1;if ((int)Cf.size() > m){borrow = 0;Cf = Cf.substr(1);}Ci = sub(Ai, Bi, 10);if (borrow)Ci = sub(Ci, to_string(borrow), 10);if (Ci.size() > 1 && Ci[0] == '0')Ci.erase(0, Ci.find_first_not_of('0'));while (Cf.size() > 1 && Cf.back() == '0')Cf.pop_back();if (neg)Ci = "-" + Ci;return Ci + "." + Cf;
}int main()
{string a, b;cin >> a >> b;string C = pow(a, b);cout << C << endl;return 0;
}

第四期完结!

看完了点个赞再走嘛

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

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

相关文章

IDEA-idea2013连接Mysql数据库

IDEA-idea2013连接Mysql数据库 右侧DataBase图表,选择Mysql输入用户名和密码 => 点击TestConnection成功会显示点击这里选择schemas

SpringSecurity5(8-权限注解)

Spring Security 提供多种权限注解,如 @PreAuthorize、@PostAuthorize、@Secured 和 @RolesAllowed,用于方法级别的访问控制。@PreAuthorize 适用于方法执行前权限检查,@PostAuthorize 可在方法执行后验证返回值权限,@Secured 和 @RolesAllowed 主要基于角色控制。注解使用…

Windows Server 2025 中文版、英文版下载 (2025 年 3 月更新)

Windows Server 2025 中文版、英文版下载 (2025 年 3 月更新)Windows Server 2025 中文版、英文版下载 (2025 年 3 月更新) Windows Server 2025 LTSC x64 (updated Mar 2025) 请访问原文链接:https://sysin.org/blog/windows-server-2025/ 查看最新版。原创作品,转载请保留出…

分享报表工具核心三种扩展模型示例

报表工具的核心是父子格扩展模型,通过父子格扩展模型实现各种类型报表,例如网格式报表、行式报表、主子报表、分组报表、交叉报表等。报表有三种扩展模型父子格扩展模型双父格扩展模型兄弟格扩展模型父子格扩展模型B7单元格是第7行所有其它单元格的父格,其它单元格随父格扩展…

centos忘记密码

centos6系统忘记密码: 1、在开机启动的时候快速按键盘上的“E”键 或者“ESC”键,会进入如下界面2、选择你忘记密码的内核,再次按“E”,出现下图,选择第二项,(以kernel开头的行)再次按“E”键3、在信息的最后加“空格”,直接输入数字的“1”(如图)或者 键入“single…

.NET 10 Preview 2 增强了 Blazor 和.NET MAUI

.NET 团队 3.18 发布了.NET 10 Preview 2(https://devblogs.microsoft.com/dotnet/dotnet-10-preview-2/)。.NET 10 Preview 2 主要对 Blazor 和.NET MAUI 进行了增强。Blazor 在 ASP.NET Core 网络开发框架中的组件以及.NET MAUI 获得了最多关注。此次更新主要集中在小的修复…

读DAMA数据管理知识体系指南26数据集成实施指南

读DAMA数据管理知识体系指南26数据集成实施指南1. 工具 1.1. 数据转换引擎/ETL工具1.1.1. 数据转换引擎(或ETL工具)是数据集成工具箱中的主要工具,是每个企业数据集成程序的核心1.1.2. 无论是批量的还是实时的,物理的或虚拟的数据都存在运用非常复杂的工具来开发和执行ETL1…

BFS 算法模板及使用

BFS 算法模板及使用 什么是 BFS 算法? BFS (Breadth-First Search) 算法,中文全称广度优先搜索(宽度优先搜索), 区别于 DFS 算法一条路走到黑的本质, BFS 使用扩散性搜索。它将会根据规则一层一层向下搜索,容易发现,BFS 算法找到的路径一定是最短的,同时,它的时间复…

ResNet-152 模型性能评估

ResNet-152 模型在渴望模式下的性能评估为了预热 GPU,在进行 20 次额外迭代以获取模型的平均推理时间之前,先运行 ResNet-152 模型 10 次。n_warmup = 10n_test = 20dtype = torch.bfloat16inference_time=[]mode=[]t_warmup, _ = timed(lambda:model(input_batch), n_warmup…

推荐专著1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

当巴别塔倒下。——从mygo到mujica

。序章 ???? 那时,天下人的口音,言语,都是一样。他们往东边迁移的时候,在示拿地遇见一片平原,就住在那里。他们彼此商量说,来吧,我们要作砖,把砖烧透了。他们就拿砖当石头,又拿石漆当灰泥。他们说,来吧,我们要建造一座城和一座塔,塔顶通天,为要传扬我们的名,…

一文速通Python并行计算:00 并行计算的基本概念

该文介绍了Python并行计算的核心概念、编程模型及其应用,并介绍了了并行程序的性能分析与优化方法,如并行效率、加速比及Amdahl定律。此外,该文介绍了共享内存、消息传递、数据并行和任务并行等并行编程模型,并提供Python环境配置指南。一文速通 Python 并行计算:00 并行计…