直接拿之前一次竞赛中写的code,稍微完善了点,后面有机会在优化

uint64_t GetNextPalindrome(uint64_t data)
{
//100以内的数字已经特殊考虑过,不存在差值1的两个回文数
//首先得到长度,如果是奇数,取前一半+中间值构造,如果是偶数,取前一半构造 //====================
//添加部分code,得到通用的获取下一个回文数的函数,记录到代码库里面,有需要时候直接拿来用
//函数功能是获取下一个回文数,
//下面的是100意外的部分,这里添加100以内的处理
//if (data < 100)
//{
// if (data < 9)
// {
// //个位数,直接加1
// return data + 1;
// }
// //两位数
//}
//构建表直接返回好了
if (data < 100)
{
vector<int> tmpdata= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99,101 };
for (int i = 0; i < tmpdata.size(); i++)
{
if (data < tmpdata[i])
{
return tmpdata[i];
}
}
}
//==================== uint64_t tmpdata = data;
uint64_t length = 0;
while (tmpdata)
{
tmpdata /= 10;
length++;
}
//到这里得到数据长度,根据奇偶判断
if (length % 2 == 0)
{
//偶数长度
uint64_t highhalf;
highhalf = data / (uint64_t)(pow(10, length / 2)); //得到前一半
uint64_t lowhalf;
lowhalf = data % (uint64_t)(pow(10, length / 2)); //低一半
uint64_t tmphigh = GetPallindrom(highhalf);
if (tmphigh > lowhalf)
{
//只需要将高一般构建结果即可
return data + (tmphigh - lowhalf);
}
else
{
highhalf += 1;
uint64_t tmplength = 0;
tmpdata = highhalf;
while (tmpdata)
{
tmpdata /= 10;
tmplength++;
}
if (tmplength == length / 2)
{
//没产生进位
return highhalf*pow(10, tmplength) + GetPallindrom(highhalf);
}
else
{
//返回奇数个的10X01
return highhalf*pow(10, tmplength - 1) + GetPallindrom(highhalf);
} }
}
else
{
//奇数长度中间+1即可,如果原来是9,变为10XX01
uint64_t highhalf = data / (uint64_t)(pow(10, length / 2));
uint64_t mid = highhalf % 10;
highhalf /= 10;
uint64_t lowhalf = data % (uint64_t)(pow(10, length / 2));
uint64_t tmphighhalf = GetPallindrom(highhalf); //不需要动到中间位置数组
if (tmphighhalf > lowhalf)
{
return data + (tmphighhalf - lowhalf);
} //需要更新中间数字
if (mid < 9)
{
return (highhalf * 10 + mid + 1)*pow(10, length / 2) + tmphighhalf;
}
else
{
//高一半+1不进位,只需要高一半+1,该位变0即可,比如191 -> 202
//如果高位+1后需要进位,如99X,则需要变为1001,即最小的高一位
mid = 0;
highhalf += 1;
tmphighhalf = GetPallindrom(highhalf);
uint64_t tmplength = 0;
tmpdata = highhalf;
while (tmpdata)
{
tmpdata /= 10;
tmplength++;
}
if (tmplength == length / 2)
{
//没产生进位
return (highhalf * 10 + mid)*pow(10, length / 2) + tmphighhalf;
}
else
{
//产生了进位 比如999应该变为1001
return highhalf*pow(10, tmplength) + tmphighhalf;
}
} }
} uint64_t GetPallindrom(uint64_t data)
{
uint64_t ret = 0;
while (data>0)
{
ret = ret * 10 + data % 10;
data = data / 10;
}
//cout << "debug:" << data << " -> " << ret << endl;;
return ret;
}

tmp_获取下一个回文数的更多相关文章

  1. 用python实现一个回文数

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

  2. 洛谷 P1609 最小回文数 题解

    这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...

  3. [2014亚马逊amazon] 在线笔试题 大于非负整数N的第一个回文数 Symmetric Number

    1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 这个题目也是当时笔试第一次见到,花了一个小时才做出了.慢慢总结还是挺简单的. 2.分析 分析如下: (1)一位数N(9 ...

  4. leetcode9_C++判断一个整数是否是回文数

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

  5. 判断一个整数是否是回文数C++实现 leetcode系列(九)

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

  6. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  7. C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

    各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...

  8. luogu10125回文数[noip1999 Day1 T1]

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  9. 合工大OJ 1331 回文数

    Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数. 任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数, ...

随机推荐

  1. safari不支持new Date函数

    最近在做移动Web的时候,在PC上用Chrome调试都成功了,但是在iPhone上真机一测就出现了奇怪的问题.经过一系列调试发现是日期相关的地方出现了问题.起初怀疑是生产环境的问题,但用Mac版的sa ...

  2. 【考试记录】2018 山东省队集训第一轮D4(雾)

    T1题意: 给你一个$n\times m$的矩阵$B$,求它能由最少多少个形如两个向量之积$(n\times 1)\times(1\times m)$的矩阵相加得到. 题解: 考虑上界,最多需要$mi ...

  3. 洛谷 P3676 小清新数据结构题

    https://www.luogu.org/problemnew/show/P3676 这题被我当成动态dp去做了,码了4k,搞了一个换根的动态dp #include<cstdio> #i ...

  4. python入门2(补发a)

    一.流程控制-while循环,结构如下: while 条件: 结果 如果条件是真,则直接执行结果,然后再次判断条件,直到条件是假,停止循环 那么我们如何终止循环呢? 1,改变循环条件 2,break ...

  5. mysql 启动停止脚本 and mysql 迁移 导入和导出

    ####监控脚本 [root@pdb~]# more /opt/VRTS/scripts/mysql_monitor.sh#!/bin/shn=`ps -ef |grep mysql|grep &qu ...

  6. SpringBoot---核心---基本配置

    1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件

  7. java中接口(interface)和虚基类(abstract class)的区别

    在Java语言中,abstract class和interface是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interfa ...

  8. paas相关,添加ing

    1. docker 构建镜像,docker build -t image_name:version dockerfilePath.使用镜像启动一个docker容器,docker run --name ...

  9. JAVA基础之File类

    个人理解: File是个文件类,可以用其增加.删除.查找某种类型的文件或者文件夹,同时根据其成员变量的特点可以综合利用,避免出现跨系统的时候出现错误,并且查找时最好输入绝对路径,以免出现不存在的文件. ...

  10. QrenCode : linux命令行下生成二维码图片

    原文链接:http://wowubuntu.com/qrencode.html # 作者:riku/ / 本文采用CC BY-NC-SA 2.5协议授权,转载请注明本文链接. 对于二维码大家应该并不陌 ...