蓝桥杯 算法提高 回文串
题目
问题描述
一个正整数N被称为回文数,当且仅当N在十进制下,正着读和反着读是一样的。
如12321是回文的,而12320不是。
现在让你求出第K小的回文数。(第0小的是 1,第1小的是 2)
输入格式
输入一个数K。
输出格式
一个数字N,为第K小的回文数。
样例输入
19
样例输出
111
数据规模和约定
对于30% 的数据 K≤10000;
对于100% 的数据 K≤109。
思路
以 4位数 为例,如果它是回文数的话,那么它的高2位与低2位对称。如:1221。这样的4位数有多少种呢?那就看有多少个不同的高2位,即从10到99,共90个数字。形成的回文数亦是从小到大的1001到9999。即4位的回文数共90个。
再以 5位数 为例,如果它是回文数的话,那么它的高2位与低2位对称。如:12321。这样的5位数有多少种呢?那就看有多少个不同的高2位,即从100到999,共900个数字。形成的回文数从10001到99999。即5位的回文数共900个。
这便是规律了。
如下表格,以n = 3为例,3位数的回文数有90个,最后一个3位回文数是999,是第107小回文数。
回文数的位数 n | n 位数的回文数个数 | 最后一个 n 位回文数对应的k值 |
1位 | 9 | 8 |
2位 |
9 | 17 |
3位 | 90 | 107 |
4位 | 90 | 197 |
5位 | 900 | 1097 |
6位 | 900 | 1997 |
7位 | 9 000 | 10997 |
8位 | 9 000 | 19997 |
9位 | 90 000 | 109997 |
10位 | 90 000 | 199997 |
11位 | 900 000 | 1099997 |
12位 | 900 000 | 1999997 |
13位 | 9 000 000 | 10999997 |
14位 | 9 000 000 | 19999997 |
15位 | 90 000 000 | 109999997 |
16位 | 90 000 000 | 199999997 |
17位 | 900 000 000 | 1099999997 |
18位 | 900 000 000 | 1999999997 |
如何确定 第k个回文数的位数 是一个关键点,可以根据 k 值的大小,锁定位数,具体见代码。
代码
#include <iostream>
using namespace std;
#include <sstream>
#include <cmath>//数字转字符串
void i2s(string& str, int n)
{stringstream ss;ss << n;ss >> str;
}int main()
{int k,flag = 0; // flag表示回文数的位数cin >> k;if (k <= 8){cout << k + 1;return 0;}unsigned long ak[25] = { 0 };//首先建立一个数组,ak[0] = 8;ak[1] = 17;for (int i = 2;i <= 16;i++){ak[i] = ak[i-1] + 9 * pow(10,i / 2);if (ak[i] > k){flag = i + 1; //记下回文数所在的位置break;}}// cout << "flag = "<<flag << endl;int temp = pow(10, (flag - 1) / 2) + k - ak[flag - 2] - 1; //k = 2000时 2000 - 1997 = 3 flag = 7 1002001string ts;i2s(ts,temp);ts.resize(20);// cout <<ts<<" " << flag<<" here " << endl;for (int i = 0;2 * i + 1 < flag; i++){ts[flag - i - 1] = ts[i]; //根据 对称性 生成回文数}cout << ts << endl;// for (int i = 0; i <= 16; i++)
// cout << ak[i] << endl;return 0;
}
总结
【废话】刚开始本来是想遍历至第k个回文数,发现无论怎么优化,都超时,只能得40分。而且意识到第1e9个回文数应该是一个17位的数,太大了。回文数的密度挺低的。想着这里面一定有什么规律。因为最近刚学筛法以及刚接触到生成法,想着能不能生成回文数。
第一次用resize函数。
蓝桥杯 算法提高 回文串相关推荐
- c语言oj题1923偶数之和,问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 (BFS)
题目描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...
- 【算法】双指针算法 ( 有效回文串 II )
算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...
- [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索
题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...
- [蓝桥杯][算法提高VIP]夺宝奇兵-dp
题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...
- JAVA 蓝桥杯 算法提高 阮小二买彩票
JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...
- [蓝桥杯][算法提高VIP]阮小二买彩票
[蓝桥杯][算法提高VIP]阮小二买彩票 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下 ...
- 10.python解答蓝桥杯省赛 回文数字
10.python解答蓝桥杯省赛 回文数字 试题 历届试题 回文数字 提交此题 评测记录 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 观察数字:12321,123321 都有一个 ...
- 【蓝桥杯算法提高VIP-开灯游戏(两种超易理懂解法:暴力/位操作(切换位))(纯正C语言代码)】
蓝桥杯算法提高VIP-开灯游戏 题目描述 有9盏灯与9个开关,编号都是1~9. 每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的). 具体如下: 第一个开关控制第二, ...
- [蓝桥杯][算法提高] 填充蛋糕
[蓝桥杯][算法提高] 填充蛋糕 编程计算涂满高为2,半径为r的圆形蛋糕表面,需要多少表面积的奶油(只要涂上表面和侧面) 读入一个数r,输出需要奶油的表面积,结果保留一位小数 样例输入 5.0 样例输 ...
最新文章
- Vijos1683 有根树的同构问题
- 解决Win10下_findnext()异常
- python dict常用操作
- [痛并快乐着 国外开发者总结欧美游戏坑钱指南] 讀後感想
- 【项目实战课】微信小程序图像识别模型前后端部署实战
- iftop是一个很好用的实时流量监测程序,跟使用iftop查看linux连接进程占用的实时流量...
- 爬虫的增量式抓取和数据更新
- 苹果Mac上如何使用预览反转图片?
- java允许跨域设置
- 土壤类型空间分布数据介绍
- Debian安装ssh
- pyodbc linux 乱码,关于python:无法在Linux上安装pyodbc
- nyoj-动态规划-234-吃土豆-201308131021
- docker下载gcr.io镜像
- 不了心修改了/etc/sudoers原本的权限0777,进不去root,现在提供一个良好的解决办法~
- python matplotlib jupyter中绘图使用宋体
- 华为云会议,基于云计算的远程会议
- 数据分析师8大经典问题
- java计算机毕业设计夕阳红养老院系统源码+lw文档+系统+数据库
- U3D_Maze开发手记
热门文章
- 学生网站模板:旅游出行网站设计——旅游网设计(15页) HTML+CSS+JavaScript 学生DW网页设计作业成品 学生旅游网站模板
- 计算机游戏活动总结,关于亲子游戏活动总结最新三篇
- ESP8266与PS2通信
- 【bzoj4826】影魔
- 【代码篇】计算两张图片的偏移量
- 物联网计算机高铁工作,说说物联网在铁路当中的应用前景
- <UART 波形分析><1>基于RIGOL_DS1202ZE示波器分析串口数据
- 丁鹿学堂:css预处理器之less学习(一)
- 如何创建计算机桌面快捷方式,百度桌面-如何创建百度桌面快捷方式怎样在自己电脑桌面 – 手机爱问...
- C# 动态 条件 组合_3D模型+平滑,在PPT中实现动态呈现