题目链接: http://poj.org/problem?id=2402

题目大意就是让你找到第n个回文数是什么.

第一个思路当然是一个一个地构造回文数直到找到第n个回文数为止(也许大部分人一开始都是这样的思路). 很明显找到第n个之前的所有操作都是浪费, 这也是这个方法的最大弱点. 抱着侥幸心理(谁知道数据弱不弱啊)用这种方法提交了下, TLE (在另一个OJ上提交是9个测试点过了6个).

第二个思路也很容易想到, 但是比第一个思路要麻烦: 第n个回文数的每位数字都与n有一定的关联. 也就是说由n的值可以推测出回文数. 那么如何推算呢? 首先当然要来找规律. 我们可以发现:

位数为1和2的回文数有9个 (1-9, 11-99)

位数为3和4的回文数有90个 ({101-191, 202-292, ...}, {1001-1991, 2002-2991, ...})

位数为5和6的回文数有900个 (不再列举)

......

所以:

1-9个回文数的位数为1

10-18个回文数的位数为2

......

然后确定了位数之后(从某种意义上说)n已经没有用了, 此时有用的应该是n在这个区间的位置.

比如第11个回文数是2位数, 11在10-18这个区间中是第2个. 2位数的回文数是从11-99, 而11在10-18中是第2个, 所以是11-99中的第2个, 也就是22.

然后把n的区间拉到19-98, 也就是说回文数是3位数的时候. 从19-28, 也就是这个区间当中的第1-10个, 它们的第1位和第3位都是1(1-10是这个区间中的第1组10个数); 从29-38(区间中的第11-20个), 它们的第1位和第3位都是2(11-20是这个区间中的第2组10个数); 以此类推.

继续看19-28(区间中的第1-10个), 它们在区间中的序号就是回文数的第二位.

......

所以, 就可以发现区间决定一切. 回文数的每一位, 都由n所处的区间所决定.

到这里大概就可以写出程序了. 有些细节可能需要处理. 下面上代码.

 1 #include <iostream>
 2 using namespace std;
 3
 4 char toch(int n) {
 5     return n+'0';
 6 }
 7
 8 long long power(int e) {
 9     int sum = 1, i = 0;
10     for (; i<e; i++)
11         sum *= 10;
12     return sum;
13 }
14
15 void gen(long long n, char* s) {
16     long long i, lvl = 0, w, t, div;
17     for (i=0; ; i++) {
18         t = 9 * power(i/2);
19         if (n <= lvl+t) {
20             w = i+1;
21             n -= lvl;
22             break;
23         }
24         lvl += t;
25     }
26     n--;
27     div = power((w-1)/2);
28     for (i=0; i<(w+1)/2; i++) {
29         s[i] = s[w-i-1] = toch(w<3 ? n/div+1 : (i?n/div:n/div+1));
30         n %= div;
31         div /= 10;
32     }
33 }
34
35 int main() {
36     long long t;
37     while (1) {
38         cin >> t;
39         if (!t)
40             break;
41         char s[1000] = {0};
42         gen(t, s);
43         cout << s << endl;
44     }
45     return 0;
46 }

//其实没必要long long, 这里只是为了保险起见.

转载于:https://www.cnblogs.com/lsdsjy/p/poj2402.html

POJ2402 Palindrome Numbers 回文数相关推荐

  1. 【LeetCode】Palindrome Number(回文数)

    这道题是LeetCode里的第9道题. 题目说的: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: ...

  2. [leetcode] Palindrome Number 回文数判断

    Determine whether an integer is a palindrome. Do this without extra space. 题目大意:略 bool isPalindrome( ...

  3. C++判断一个数是否为回文数palindrome的算法(附完整源码)

    C++判断一个数是否为回文数palindrome的算法 C++判断一个数是否为回文数palindrome的算法完整源码(定义,实现,main函数测试) C++判断一个数是否为回文数palindrome ...

  4. C语言判断一个数是否是回文数Palindrome算法(附完整源码)

    判断回文数Palindrome的算法 判断回文数Palindrome的算法完整源码(定义,实现,main函数测试) 判断回文数Palindrome的算法完整源码(定义,实现,main函数测试) #in ...

  5. Palindromic Numbers LightOJ - 1205 数位dp 求回文数

    传送门 文章目录 题意: 思路: 题意: 求[l,r][l,r][l,r]中有多少个回文数. 思路: 裸的数位dpdpdp啦,记dp[pos][pre][state]dp[pos][pre][stat ...

  6. Leetcode 9. 回文数(Palindrome Number)

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  7. 479 Largest Palindrome Product 最大回文数乘积

    你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x 91 = 9009, 90 ...

  8. LeetCode第9题 回文数(Palindrome Number)

    文章目录 题目地址 题目描述 代码实现 解法一:普通解法 解法二:进阶解法---数学解法 解法三:进阶解法---巧妙解法 题目地址 题目地址https://leetcode-cn.com/proble ...

  9. LeetCode 9. 回文数 Palindrome Number

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

最新文章

  1. 前端开发工程师 - 04.页面架构 - CSS Reset 布局解决方案 响应式 页面优化 规范与模块化...
  2. DOS命令下Javac命令不能执行原因
  3. MS SQL入门基础:创建索引
  4. ASP实现单条件和多条件组合查询的实例
  5. shell随机数及按行切割文件
  6. pytorch基本数学运算:加法 减法 乘法 除法 指数 对数 绝对值
  7. XBMC 最新版本错误
  8. 牛客网暑期ACM多校训练营(第三场)A - PAXM Team(01背包)
  9. spring整合struts2时作用域scope解析
  10. java i 线程不安全_java中的++i是线程安全的吗?
  11. 先思再行 闭着眼睛编程
  12. 阿里云应用配置管理ACM发布,重新定义云上配置的存放方式
  13. 硬核Redis总结,看这篇就够了!
  14. Vijos 1603 ----迷宫(矩阵乘法,矩阵快速幂)
  15. hdu4521 小明系列的问题——小明序列(LIS变种 (段树+单点更新解决方案))
  16. SSM之Mybatis框架初步
  17. k8s调度 原理_开源爆款,阿里P7技术笔记《k8s+docker》,图文并茂,理论与实战齐飞!...
  18. 宝宝头三年影响一生[转]
  19. ue4渲染速度太慢_技术汇丨如何在UE4中实现最佳性能和高质量视觉效果
  20. Servlet 浅析

热门文章

  1. linux 组的管理,LINUX用户组管理各命令的使用
  2. 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)
  3. linux下如何在shell中结束进程(ctrl+c\ctrl+z\ctrl+d\ctrl+\的用法)
  4. 64位ubuntu 12.04编译linux内核提示openssl/opensslv.h文件缺失
  5. 【Python-随机旋转】图像随机旋转及坐标进行旋转原理
  6. 解决the NTP socket is in use, exiting问题
  7. macOSX中使用python matplotlib模块的问题解决
  8. FTP和TFTP的区别与介绍
  9. 达内软件测试证书是什么证书,达内软件测试培训让我拥有了实际工作经验
  10. 5错误怎么办_“选择不对,一生白费”:如果选错了,该怎么办?记住这两句话...