当前位置: 首页 > news >正文

P1643 完美数 题解

完美数

首先,介绍一下这篇题解的特邀嘉宾:ChatGPT4.0

传送门

题目描述

考古队员小星在一次考察中意外跌入深渊,穿越到了一个神秘的荒漠。这里有许多超越他认识的事物存在,例如许多漂浮在空中的建筑,例如各种奇怪的动物。

在这片荒漠的中央,小星发现了一个巨大的类似神庙的建筑,为了脱离这片空间,小星决定前去探索。

在临近神庙大门时,突然跳出了一个人面狮(不是斯芬达克斯)!它咆哮着:

“我是这里的守卫,要想通过这里,必须回答出我的一系列问题,否则,我就吃了你。”

人面狮告诉小星,问题总是这样的模式:比 X X X 大的第 N N N 小的回文数是多少。

小星想,这个问题看来不难,于是问答开始了。

“比 1 1 1 大的第 1 1 1 小回文数数是多少?”

2 2 2

“比 17 17 17 大的第 2 2 2 小的回文数是多少?”

33 33 33

“比 98 98 98 大的第 2 2 2 小的回文数是多少?”

101 101 101

“那比 948237 大的第 2339587 小的回文数是多少?”

“*(•%(*•—#•#¥*—%(*—%”

为了避免被守卫吃掉,小星只好打开笔记本想借助电脑,却意外地发现可以通过网络(网通?电信?宇宙通?)找到你,于是这个问题就拜托给你了!

输入格式

本题每一个数据包含有多组数据。

对于每一个数据包,第一行一个数 T T T,表示总共有 T T T 组数据。

对于每一组数据,包括两行,第一行为 X X X,第二行为 N N N,表示当前询问是比 X 大的第 N 小的回文数是多少。

输出格式

对于每一组数据输出一行,表示询问的结果。

样例 #1

样例输入 #1

3
1
1
17
2
98
2

样例输出 #1

2
33
101

提示

【数据规模】

20 % 20 \% 20% 的数据满足 X ≤ 200000 X \le 200000 X200000 N ≤ 1000 N \le 1000 N1000

30 % 30 \% 30% 的数据满足 X , N X, N X,Nlongint 范围之内,且答案也在 longint 范围之内。

100 % 100 \% 100% 的数据满足 X , N ≤ 10 10000 X, N \le {10}^{10000} X,N1010000,答案 ≤ 10 20001 \le {10}^{20001} 1020001 T ≤ 10 T \le 10 T10

以上来自洛谷 以上来自洛谷 以上来自洛谷

解题思路(所有思路与代码都由ChatGPT特供,本人只加以润色)

暴力思路(ChatGPT友情赞助)

  1. 首先需要找到比X大的第N小的回文数,可以从X+1开始逐个判断是否是回文数,直到找到第N个回文数为止。
  2. 判断一个数是否是回文数可以将其转化为字符串,然后判断字符串是否是回文字符串。
  3. 找到第N个回文数后输出即可。
伪代码:
  1. 读入T
  2. 循环T次:
    1. 读入X和N
    2. 初始化count为0,ans为0
    3. 从X+1开始逐个判断是否是回文数,直到count等于N为止:
      1. 将当前数转化为字符串
      2. 判断该字符串是否是回文字符串:
        1. 初始化i为0,j为字符串长度-1
        2. 循环i小于j:
          1. 如果字符串第i个字符不等于第j个字符,则不是回文字符串跳出循环
          2. 否则,i加1,j减1
        3. 如果i大于等于j,表示是回文字符串,将count加1
      3. 如果count等于N,表示找到了第N个回文数,将ans赋值为当前数
    4. 输出ans
Code1
#include <iostream>
#include <string>
using namespace std;bool isPalindrome(string num) {int i = 0, j = num.length() - 1;while (i < j) {if (num[i] != num[j]) {return false;}i++;j--;}return true;
}int main() {int T;cin >> T;for (int t = 0; t < T; t++) {int X, N;cin >> X >> N;int count = 0;int ans = 0;for (int num = X + 1; count < N; num++) {string numStr = to_string(num);if (isPalindrome(numStr)) {count++;ans = num;}}cout << ans << endl;}return 0;
}

暴力优化(依旧是ChatGPT大佬提供)

要降低时间复杂度,可以采用以下方法:

  • 判断一个数是否是回文数,可以不用将其转化为字符串,而是直接在数字上进行操作。
  • 可以利用回文数的对称性质来判断是否是回文数,即从两端往中间进行比较。
  • 找到第N个回文数后,不需要继续判断后面的数,可以直接跳出循环。
Code2
#include <iostream>
using namespace std;bool isPalindrome(int num) {int reversedNum = 0;int temp = num;while (temp > 0) {int digit = temp % 10;reversedNum = reversedNum * 10 + digit;temp /= 10;}return num == reversedNum;
}int main() {int T;cin >> T;for (int t = 0; t < T; t++) {int X, N;cin >> X >> N;int count = 0;int ans = 0;for (int num = X + 1; count < N; num++) {if (isPalindrome(num)) {count++;ans = num;}}cout << ans << endl;}return 0;
}

继续优化(依然是它)

要进一步降低时间复杂度,可以采用以下方法:

  • 判断一个数是否是回文数的操作可以进一步优化。可以只判断一半的数字,而不需要全部反转,然后与另一半进行比较。
  • 可以通过找到下一个回文数的规律来快速找到第N个回文数。

优化后的代码如下:

Code3
#include <iostream>
using namespace std;bool isPalindrome(int num) {if (num < 0 || (num % 10 == 0 && num != 0)) {return false;}int reversedNum = 0;while (num > reversedNum) {reversedNum = reversedNum * 10 + num % 10;num /= 10;}return num == reversedNum || num == reversedNum / 10;
}int getNextPalindrome(int num) {num++;while (!isPalindrome(num)) {num++;}return num;
}int main() {int T;cin >> T;for (int t = 0; t < T; t++) {int X, N;cin >> X >> N;int ans = getNextPalindrome(X);for (int i = 1; i < N; i++) {ans = getNextPalindrome(ans);}cout << ans << endl;}return 0;
}

这样,我们通过优化判断回文数的方式以及找到下一个回文数的规律,可以更快地找到第N个回文数,进一步降低时间复杂度。

加上高精度算法优化(是它)

要使用高精度算法优化,可以采用以下方法:

  • 定义一个高精度整数类,可以实现大整数的加法、减法和乘法等操作。
  • 在每次计算回文数时,将当前数字转化为高精度整数,进行高精度的加法操作,直到找到第N个回文数。
Code4(TLE 20)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;vector<int> add(vector<int>& a, vector<int>& b) {vector<int> res;int carry = 0;int n = max(a.size(), b.size());for (int i = 0; i < n; i++) {int sum = carry;if (i < a.size()) {sum += a[i];}if (i < b.size()) {sum += b[i];}res.push_back(sum % 10);carry = sum / 10;}if (carry) {res.push_back(carry);}return res;
}bool isPalindrome(vector<int>& num) {int n = num.size();for (int i = 0; i < n / 2; i++) {if (num[i] != num[n - 1 - i]) {return false;}}return true;
}vector<int> getNextPalindrome(vector<int>& num) {int carry = 1;int n = num.size();for (int i = 0; i < n; i++) {num[i] += carry;carry = num[i] / 10;num[i] %= 10;}if (carry) {num.push_back(carry);}return num;
}int main() {int T;cin >> T;for (int t = 0; t < T; t++) {vector<int> X;string str;cin >> str;for (int i = str.size() - 1; i >= 0; i--) {X.push_back(str[i] - '0');}int N;cin >> N;vector<int> ans = X;for (int i = 0; i < N; i++) {ans = getNextPalindrome(ans);while (!isPalindrome(ans)) {ans = getNextPalindrome(ans);}}for (int i = ans.size() - 1; i >= 0; i--) {cout << ans[i];}cout << endl;}return 0;
}
  • 注:该程序经本人改造。

优化++(还是它)

要进一步优化该程序,我们可以通过以下方式来提高效率:

  • 不需要每次都判断当前数是否是回文数,只需要在最后输出时判断即可。
  • 在计算下一个回文数时,可以直接从当前数一半开始倒序复制,这样可以减少循环次数。
Code5(RE 30)(加上高精度就AC了)
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;vector<int> tmp(1, 0);void initialize() {for (int i = 0; i < 20000; i++) {tmp.push_back(-1);}
}int sum(int x) {if (tmp[x] != -1) {return tmp[x];}if (x % 2 == 0) {tmp[x] = (pow(10, x / 2) - 1) / 9 * 2;}if (x % 2 == 1) {tmp[x] = sum(x + 1) - pow(10, x / 2);}return tmp[x];
}pair<int, int> count(int x) {x = (x + 8) / 9;int i = to_string(x).length() - 9;if (i < 1) {i = 1;}while (true) {if (sum(i) >= x) {return make_pair(i, 9 * sum(i - 1));}i++;}
}int solve(int x) {pair<int, int> result = count(x);int cnt = result.first;int sum = result.second;int half = pow(10, (cnt + 1) / 2 - 1) + (x - sum - 1);if (cnt % 2 == 1) {string halfStr = to_string(half);return stoi(halfStr.substr(0, halfStr.length() - 1) + string(halfStr.rbegin(), halfStr.rend()));} else {string halfStr = to_string(half);return stoi(halfStr + string(halfStr.rbegin(), halfStr.rend()));}
}int rev(int x) {int sz = to_string(x).length();int Sum = sum(sz - 1) * 9;Sum += stoi(to_string(x).substr(0, (sz + 1) / 2)) - pow(10, sz / 2 + sz % 2 - 1);while (solve(Sum) <= x) {Sum++;}return Sum - 1;
}int main() {initialize();int T;cin >> T;for (int i = 0; i < T; i++) {int N, X;cin >> N >> X;cout << solve(X + rev(N)) << endl;}return 0;
}

AC Code

//Code5加上高精度

我之所以不给代码是为了你们养成勤于动手的好习惯

相关文章:

P1643 完美数 题解

完美数 首先&#xff0c;介绍一下这篇题解的特邀嘉宾&#xff1a;ChatGPT4.0 传送门 题目描述 考古队员小星在一次考察中意外跌入深渊&#xff0c;穿越到了一个神秘的荒漠。这里有许多超越他认识的事物存在&#xff0c;例如许多漂浮在空中的建筑&#xff0c;例如各种奇怪的…...

docker一键安装

1.把docker_compose_install文件夹放在任意路径&#xff1b; 2.chmod -R 777 install.sh 3.执行./install.sh 兼容&#xff1a;CentOS7.6、麒麟V10服务器版、统信UOS等操作系统。 下载地址&#xff08;本人上传&#xff0c;免积分下载&#xff09;&#xff1a;https://downlo…...

模板管理支持批量操作,DataEase开源数据可视化分析平台v2.2.0发布

2024年1月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.2.0版本。 这一版本的功能升级包括&#xff1a;在“模板管理”页面中&#xff0c;用户可以通过模板管理的批量操作功能&#xff0c;对已有模板进行快速重新分类、删除等维护操作&#xff1b;数据大屏中&…...

阿里云实时计算企业级状态存储引擎 Gemini 技术解读

本文整理自阿里云 Flink 存储引擎团队李晋忠&#xff0c;兰兆千&#xff0c;梅源关于阿里云实时计算企业级状态存储引擎 Gemini 的研究&#xff0c;内容主要分为以下五部分&#xff1a; 流计算状态访问的痛点企业级状态存储引擎GeminiGemini 性能评测&线上表现结语参考 一、…...

web缓存之nginx缓存

一、nginx缓存知识 网络缓存位于客户端和 "源服务器 "之间&#xff0c;保存着所有可见内容的副本。当客户端请求缓存中存储的内容时&#xff0c;它可以直接从缓存中检索内容&#xff0c;而无需与服务器通信。这样&#xff0c;网络缓存就 "接近 "了客户端&a…...

【用法总结】无障碍AccessibilityService

一、背景 本文仅用于做学习总结&#xff0c;转换成自己的理解&#xff0c;方便需要时快速查阅&#xff0c;深入研究可以去官网了解更多&#xff1a;官网链接点这里 之前对接AI语音功能时&#xff0c;发现有些按钮&#xff08;或文本&#xff09;在我没有主动注册唤醒词场景…...

AI绘画风格化实战

在社交软件和短视频平台上&#xff0c;我们时常能看到各种特色鲜明的视觉效果&#xff0c;比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格&#xff0c;每一种都带有鲜…...

008定点小数、奇偶校验码

...

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件&#xff1a;ca-config.json ② 创建 CA 证书签名请求文件&#xff…...

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…...

数据结构.线性表(2)

一、模板 例子&#xff1a; a: b: 二、基本操作的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;销毁和清空 &#xff08;3&#xff09;求长度和判断是否为空 &#xff08;4&#xff09;取值 &#xff08;5&#xff09;查找 &#xff08;6&#xff09;插入 &…...

【计算机网络】TCP原理 | 可靠性机制分析(三)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…...

【昕宝爸爸小模块】线程的几种状态,状态之间怎样流转

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…...

ChatGPT网站小蜜蜂AI更新了

ChatGPT网站小蜜蜂AI更新了 前阶段郭震兄弟刚开发小蜜蜂AI网站的的时候&#xff0c;写了一篇关于ChatGPT的网站小蜜蜂AI的博文[https://blog.csdn.net/weixin_41905135/article/details/135297581?spm1001.2014.3001.5501]。今天听说小蜜蜂网站又增加了新的功能——在线生成思…...

瑞_Java开发手册_(二)异常日志

文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附&#xff1a;错误码列表 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的异常日志篇&#xff0c;本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手…...

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (四)

在本节中&#xff0c;你将了解另一种机器学习搜索方法&#xff0c;该方法利用 Elastic Learned Sparse EncodeR 模型或 ELSER&#xff0c;这是一种由 Elastic 训练来执行语义搜索的自然语言处理模型。这是继之前的文章 “Elasticsearch&#xff1a;Search tutorial - 使用 Pyth…...

Python之Matplotlib绘图调节清晰度

Python之Matplotlib绘图调节清晰度 文章目录 Python之Matplotlib绘图调节清晰度引言解决方案dpi是什么&#xff1f;效果展示总结 引言 使用python中的matplotlib.pyplot绘图的时候&#xff0c;如果将图片显示出来&#xff0c;或者另存为图片&#xff0c;常常会出现清晰度不够的…...

pygame.error: video system not initialized

错误处理方式&#xff1a; pygame.init() 增加此行...

java面试题2024

前言 准备换工作了&#xff0c;给自己定个目标&#xff0c;每天至少整理出一道面试题。题型会比较随机&#xff0c;感觉这样更容易随机到面试官要问的东西。整理时我会把我认为正确的回答写出来&#xff0c;比较复杂的也尽量把原理贴出来&#xff0c;争取做到无论为了应付面试&…...

配置git服务器

第一步&#xff1a; jdk环境配置 &#xff08;1&#xff09;搜索【高级系统设置】&#xff0c;选择【高级】选项卡&#xff0c;点【环境变量】 &#xff08;2&#xff09;在【系统变量】里面&#xff0c;点击【新建】 &#xff08;3&#xff09;添加JAVA_HOME环境变量JAVA_HO…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...