直接拿之前一次竞赛中写的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. 一个VUE的小案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. CC07:清除行列

    题目 请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零. 给定一个N阶方阵int[][](C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C ...

  3. selenium基础操作

    selenium 1.打开和关闭网页 #!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver drive ...

  4. CSS3动画总结学习(一)

    参考文章: CSS3 Transitions, Transforms和Animation使用简介与应用展示 CSS 参考手册 动画的分类 平移动画 transform: 就是变换, 变换, 变换 也就 ...

  5. 066 Plus One

    给定一个非负整数组成的非空数组,给整数加一.可以假设整数不包含任何前导零,除了数字0本身.最高位数字存放在列表的首位.详见:https://leetcode.com/problems/plus-one ...

  6. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  7. restful 风格 加上springmvc

    一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. C#关键字:yield

    yield是C#为了简化遍历操作实现的语法糖.在语句中使用 yield 关键字,表示在该关键字所在的方法.运算符或 get 访问器是迭代器.有两种形式: yield return <expres ...

  9. HBuilder配置sass

    参考: https://www.cnblogs.com/padding1015/p/7133811.html 如果期间报错,参考步骤7,然后再重新安装配置 预编译配置--no-cache %FileN ...

  10. 从typeof()说起

    本文也同步发表在我的公众号“我的天空” 首先我们先思考一下,执行下列语句分别会显示什么? alert(typeof(Array)); alert(typeof(Array())); 我们进入正题! 在 ...