P1601题解

news/2025/10/24 21:02:34/文章来源:https://www.cnblogs.com/Ubuntu114/p/19164215

题意

就是A+B,相信大家都能理解,对于Python来说很简单,对C++崽就不友好了

解析

下面提供一种解法(代码中的BitInt500这个类,别问我那个什么int128函数,不顶事):
1.创建数组
2.从字符串构造大型整数
3.大整数加法(直接加肯定不行,用了逐位加法)
4.输出函数(只是懒得在程序中写影响美观)
注:*it为迭代器

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;__uint128_t a,b;
const int ma=001;class BigInt500 {
public:vector<int> digits; // 存储每一位数字,digits[0] 为最低位bool is_negative;   // 新增:标记是否为负数BigInt500() : is_negative(false) {} // 默认构造函数// 从字符串构造大整数BigInt500(const string& num) : is_negative(false) {if (num.empty()) {throw invalid_argument("Input string is empty.");}int start = 0;if (num[0] == '-') {is_negative = true;start = 1;if (start >= num.size()) {throw invalid_argument("Input string is only a minus sign.");}}for (int i = num.size() - 1; i >= start; --i) {if (isdigit(num[i])) {digits.push_back(num[i] - '0');} else {throw invalid_argument("Input string contains non-digit characters.");}}// 去除前导零while (digits.size() > 1 && digits.back() == 0) {digits.pop_back();}// 如果数字是0,重置符号if (digits.empty() || (digits.size() == 1 && digits[0] == 0)) {is_negative = false;}}// 辅助函数:比较两个BigInt500的绝对值大小bool absGreaterOrEqual(const BigInt500& other) const {if (digits.size() != other.digits.size()) {return digits.size() > other.digits.size();}for (int i = digits.size() - 1; i >= 0; --i) {if (digits[i] != other.digits[i]) {return digits[i] > other.digits[i];}}return true; // 相等}// 大整数加法BigInt500 operator+(const BigInt500& other) const {// 如果符号相同,直接相加if (is_negative == other.is_negative) {BigInt500 result;result.is_negative = is_negative;int carry = 0;int maxSize = max(digits.size(), other.digits.size());for (int i = 0; i < maxSize || carry; ++i) {int digit1 = (i < digits.size()) ? digits[i] : 0;int digit2 = (i < other.digits.size()) ? other.digits[i] : 0;int sum = digit1 + digit2 + carry;carry = sum / 10;result.digits.push_back(sum % 10);}return result;} else {// 符号不同,转为减法if (absGreaterOrEqual(other)) {return *this - other;} else {BigInt500 temp = other - *this;temp.is_negative = !temp.is_negative;return temp;}}}// 大整数减法BigInt500 operator-(const BigInt500& other) const {// 如果符号不同,转为加法if (is_negative != other.is_negative) {BigInt500 temp = other;temp.is_negative = !temp.is_negative;return *this + temp;}BigInt500 result;// 如果被减数绝对值小于减数绝对值if (!absGreaterOrEqual(other)) {result = other - *this;result.is_negative = !result.is_negative;return result;}result.is_negative = is_negative;int borrow = 0;for (int i = 0; i < digits.size(); ++i) {int digit1 = digits[i] - borrow;int digit2 = (i < other.digits.size()) ? other.digits[i] : 0;if (digit1 < digit2) {digit1 += 10;borrow = 1;} else {borrow = 0;}result.digits.push_back(digit1 - digit2);}// 去除结果中的前导零while (result.digits.size() > 1 && result.digits.back() == 0) {result.digits.pop_back();}// 如果结果是0,重置符号if (result.digits.size() == 1 && result.digits[0] == 0) {result.is_negative = false;}return result;}// 输出大整数void print() const {if (is_negative && !(digits.size() == 1 && digits[0] == 0)) {cout << '-';}for (auto it = digits.rbegin(); it != digits.rend(); ++it) {cout << *it;}cout << endl;}
};void read_uint128_t(__uint128_t &x) {string s;cin >> s;if (s.empty()) {cerr << "Error: Empty input string" << endl;return;}if (s.length() > 128) {cerr << "Error: Input string too long (exceeds 128 digits)" << endl;return;}for (char c : s) {if (!isdigit(c)) {cerr << "Error: Non-digit character in input" << endl;return;}}x = 0;for (int i = 0; i < s.size(); ++i) {x = x * 10 + (s[i] - '0');}
}void write_uint128_t(__uint128_t x) {if (x == 0) {cout << '0';return;}string s;while (x > 0) {s.push_back((x % 10) + '0');x /= 10;}// 检查结果长度是否超过128位if (s.length() > 128) {cerr << "Error: Number too large to represent as 128-bit unsigned integer" << endl;return;}reverse(s.begin(), s.end());cout << s;
}int main() {try {BigInt500 num1, num2;string str1, str2;cout << "Enter first number: ";cin >> str1;cout << "Enter second number: ";cin >> str2;num1 = BigInt500(str1);num2 = BigInt500(str2);BigInt500 diff = num1 - num2;cout << "Result: ";diff.print();} catch (const invalid_argument& e) {cerr << "Error: " << e.what() << endl;return 1;} catch (const exception& e) {cerr << "Unexpected error: " << e.what() << endl;return 1;}return 0;
}

后记

其实也不难,对吧
注:该代码可能会TLE,不过多试几遍肯定够能AC

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

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

相关文章

10-23 好题选讲总结

10-23 好题选讲总结 P13779 「o.OI R2」试机题 - 洛谷 注意特殊的数据范围。 \(K=2\) 就是黑白染色,然后检查黑白点数是否相等,\(K=3\) 可以 \(O(n^2)\) DP 设 \(f_{i,j,0/1}\) 表示子树内选了 \(j\) 个与 \(i\) 颜色…

关于驻马店市 2025 中小学信息学竞赛的记录(入门级)(未完)

全网好像都没有关于这个神秘竞赛的内容。 包括它的神秘举办方:驻马店市计算机学会。ZCF? 因此我决定写一篇记录,同时公布关于这个比赛的 几乎 所有信息。————题记By CasKPART 1. 赛前通知 本人是驻马店第*初级中…

关于Markdown的使用

因为在使用Markdown来编写博客,这里将会给出一些Markdown的笔记来方便后续使用。 标题采用#来表示几级标题,例如#为一级,##为二级。 这是一个一级标题 这是一个二级标题 字体采用*或者_来表示,一个表示斜体,两个表…

自定义Spring Cloud LoadBalancer实践

Spring Cloud负载均衡概述 在不同的Spring Cloud版本中,采用了不同的负载均衡组件。 具体来说,在Spring Cloud 2020.0版本之前,默认负载均衡器为Netflix推出的Ribbon,自Spring Cloud 2020.0版本起,Ribbon已经被标…

游记——驻马店市2025中小学信息学竞赛(未完)

全网好像都没有关于这个神秘竞赛的内容。 包括它的神秘举办方:驻马店市计算机学会。ZCF? 因此我决定写一篇游记,同时公布关于这个比赛的 几乎 所有信息。————题记By CasKPART 1. 赛前通知 以下是比赛前老师发给…

SAP折旧模拟超过1000条资产dump问题及解决

通过如下Tcode做资产折旧模拟时,发现如果超出100条资产系统会dump. S_ALR_87012936 - 折旧模拟 AR18N - 折旧模拟(新)解决办法: note:3396352 - Performance issues in Asset reporting or archiving, 可以配置单…

ABP - SqlSugar [SqlSugarModule、ISqlSugarClient、SqlSugarRepository]

SqlSugar ORM 集成 核心辅助类:SqlSugarModule:SqlSugar集成模块(需手动引入社区包)。 ISqlSugarClient:SqlSugar核心客户端。 SqlSugarRepository<T>:基于SqlSugar的仓储实现。你关注到了ABP与SqlSugar O…

Odoo18.0 对接 京东快递

京东快递 本章我们来看一下如何使用我们欧姆网络科技的京东快递插件来完成Odoo与京东快递的对接。 前期准备 首先我们要先在京东快递的开放平台注册一个商家[自研商家],并完成认证签约。入驻之后我们需要拿到如下参数…

Matplotlib常见画图工具

View PostMatplotlib常见画图工具一、Matplotlib核心基础 在开始绘图前,需掌握以下基础框架,几乎所有图表都基于此扩展:点击查看代码 # 1. 导入库 import matplotlib.pyplot as plt import numpy as np # 用于生成…

[python] 代码性能分析工具line_profiler使用指北

代码分析能够评估各部分代码的时间消耗,即进行时间复杂度分析。通过这一过程,我们可以识别影响整体运行效率的关键部分,从而更高效地利用底层计算资源。此外,代码分析也可用于评估内存使用情况,即空间复杂度,以优…

react的diff算法

这个算法用来比较虚拟dom和真实dom,从而最小化真实dom的更新 本质上是对两颗Fiber树的对比 (在Vue中是对旧VDOM树与新VDOM树的对比) 在不剪枝的情况下,时间复杂度接近O(n^3)基于最长公共子序列 (LCS) 的朴素计算为…

LLM学习记录DAY11

📘今日学习总结 tokenization分词算法 BPE分词(Byte-Pair Encoding)BPE 算法从一组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元,并将它们替换为新的词元,这一过程被称为合并。 合并的…

ABP - 当前用户 [ICurrentUser、CurrentUser]

当前用户(Current User) 核心辅助类:ICurrentUser:获取当前登录用户信息(ID、用户名、角色等)。 CurrentUser:静态快捷访问(需在请求上下文内)。在ABP框架中,ICurrentUser和CurrentUser用于获取当前登录用户…

轮次检测模型 VoTurn-80M 开源,多模态融合架构;OpenAI 收购桌面助手 Sky:实时识别屏幕自然语言交互丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度…

ABP - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

ABP vNext 框架功能模块 - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

SAP维护汇率的关键Tcode

Tcode: OB08 维护汇率Tcode:OBBS 维护汇率的折算比率☆ No matter how much you change, you still have to pay the price for the things youve done.

幂函数

观察幂函数图像结论: 所有的幂函数都过1,1点,幂函数在第一象限必有图像。 a为负数时,不过0,0点,其余都有0,0点。 一、画函数用结论,a<0,单调递减,a>0,单调递增。 二、0<a<1之间,增的缓,a>1,…

ABP vNext 框架功能模块 - 动态API(Dynamic API)[RemoteServiceAttribute | DynamicApiControllerBuilder]

动态API(Dynamic API) 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteService…

第4天(中等题 滑动窗口、哈希表)

打卡第四天 两道中等题哈希表记录元素频率:哈希表程序表示:滑动窗口+哈希表优化算法耗时≈一小时 明天继续 小tips:不小心删除可以用 Ctrl+Z 撤回刚刚消除的代码/文字