直接拿之前一次竞赛中写的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. 【bzoj1503】[NOI2004]郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13890  Solved: 5086[Submit][Stat ...

  2. hadoop分布式存储(1)-hadoop基础概念

    hadoop是一种用于海量数据存储.管理.分析的分布式系统.需要hadoop需要储备一定的基础知识:1.掌握一定的linux操作命令 2.会java编程.因此hadoop必须安装在有jdk的linux ...

  3. Ocelot实现API网关服务

    NET Core微服务之基于Ocelot实现API网关服务 https://www.cnblogs.com/edisonchou/p/api_gateway_ocelot_foundation_01. ...

  4. C8051开发环境

    1 keilC51 2 Silicon Laboratories C8051Fxxx uVision Driver_4 C:\Keil9 3  Silicon Laboratories Configu ...

  5. (转)AIX 中 Paging Space 使用率过高的分析与解决

    AIX 中 Paging Space 使用率过高的分析与解决 原文:https://www.ibm.com/developerworks/cn/aix/library/au-cn-pagingspac ...

  6. linux下火狐浏览器安装flash player插件

    1 去官方网站下载flash player 安装包.后缀名为.tar.gz,假设名称为flash.tar.gz 默认在桌面 2 下载后解压缩,使用以下命令 #tar -zxvf /root/Deskt ...

  7. sqlserver 数据库 的数据库个数统计 表个数统计 表的数据量统计(转载)

    http://www.cnblogs.com/qinche/archive/2012/08/09/app.html 由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将 ...

  8. Java中的switch语句——通过示例学习Java编程(8)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...

  9. 《移动Web前端高效开发实战》笔记2——使用Gulp构建一个ECMAScript 6和Sass应用

    8.3.1 安装和配置 运行Gulp需要Node.js环境,请参看第二章内容搭建Node.js环境.使用NPM全局安装Gulp,命令如下: npm install gulp-cli –g 然后,在项目 ...

  10. 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话

    wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...