回文数 第N个回文数

判断回文数还是不难,如果能转为字符串就更简单了。

如果是求第N个回文数呢。

12321是一个回文数,这里先考虑一半的情况。

回文数的个数其实是有规律的。如:

1位回文数: 9个

2位回文数: 9个

3位回文数: 90个

4位回文数: 90个

5位回文数: 900个

6位回文数: 900个

我们看到9、90、900,是不是很有规律,那是什么原因?很简单,我们把回文数拆开两半

[123321]来看。两半的变化一样的,那我们只算其中一半就行了。首位不能是0,所以左半最小为

100,最大为999,共有999-100=900个,如此类推。

所以我们可以基于以下原则:

1、 回文数的数位每增长2,回文数的个数为原来的10倍。如从个位回文数到百位回文数,个数

从9个变为90个。

2、 个位回文数的个数是9,1、2、3、…、9。

static long find(int index) {
        int count = 0;
        int number = 9;                        //记录数位上的回文数,如个位回文数为9
        int w = 0;                            //记录数位

        long half;                            //保存回文数的左半边的结果
        long h = 1;                            //回文数的左半边的起始基数
        long res;                            //结果

        while(true) {
            if(w > 0 && w%2 == 0) {            //每进两个数位,回文数乘以10
                number *= 10;
            }
            w++;                            //数位加一
            if(count + number > index)        //回文数大于查找的回数,跳出
                break;

            count += number;                //回文数加上当前数位上的回文数
        }

        index -= count;                        //在当前数位上的位置。如w=5,index=50,则万位上的第50个回文数是我们所求

        for(int i = 0; i < (w-1) / 2; i++) {    //求回文数的左半边的基数,如回文数在万位上,则为100
            h *= 10;
        }

        half = h + index;                        //回文数的左半边,如100 + 50 = 150

        res = half;

        if(w%2 != 0)                            //如果为奇数,则中间那个数不必算入右半边了!
            half /=10;

        while(half != 0) {                        //拼接回文数
            res = res *10 + half % 10;
            half /= 10;
        }

        return res;
    }

  

时间: 2024-08-05 13:16:22

回文数 第N个回文数的相关文章

WHU 583 Palindrome ( 回文自动机 &amp;&amp; 本质不同的回文串的个数 )

题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献乘起来.答案 mod 1e9+7 分析 : 从左到右跑一边回文自动机.对于每个前缀 能够得出其有多少个本质不同的回文子串 本质不同的回文子串的个数实际上就是自动机节点数 - 2 那么跑一遍前缀之后我们能得到所有可作为左边部分串的本质不同回文子串的个数 因为是回文串.所以我们倒着跑一遍.就同样能得到作

office选项-》高级-》显示 中, 显示此数目的“最近使用的文档” 为灰色,无法更改

问题1:office选项-->高级-->显示中, 显示此数目的“最近使用的文档” 为灰色,无法更改 问题2:office中您的管理员已关闭最近工作簿列表.请选择一个打开工作簿的位置 解决方案: 1.Win+R,运行gpedit.msc → “用户配置” → “管理模板” → “任务栏和开始菜单” → 双击“不要保留最近打开文档的记录”, 2.弹出“不要保留最近打开文档的记录 属性”对话框→勾选“已禁用” → “应用” → “确定", 3.“退出时清除最近打开文档的记录 属性”对话框

回滚的意义---JDBC事务回滚探究

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后: try{ conn.setAutoCommit(false); ps.executeUpdate(); ps.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); } 但是,这种回滚是没有意义的: 一旦commit前出错, 就不提交了, 回滚无用 一旦commit了, 说明没错, 不用回滚 找到一篇和我观点相同的文章:

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <

蓝桥杯 BASIC-7~9 特殊的数字、回文数、特殊的回文数

特殊的数字 [AC代码]: #include <iostream> #include <algorithm> #include <cstdio> using namespace std; int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); int i = 0; for (i = 10

CentOS6.4下使用默认的文档查看器打开PDF文档乱码的解决方案

 最近在CentOS6.4下使用其默认的文档查看器打开PDF文档时出现乱码的方块,有两种方法可以解决.    方法一:修改/etc/fonts/conf.d/49-sansserif.conf文件,如下: [html] view plaincopy <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <!-- If the f

git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

[git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码库回滚]: 这个是重点要说的内容

跟我学SharePoint 2013视频培训课程——怎样创建文档库并上传文档(8)

课程简介 第8天,怎样在SharePoint 2013怎样创建文档库并上传文档. 视频 SharePoint 2013 交流群 41032413

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类