tmp_获取下一个回文数
直接拿之前一次竞赛中写的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_获取下一个回文数的更多相关文章
- 用python实现一个回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- 洛谷 P1609 最小回文数 题解
这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...
- [2014亚马逊amazon] 在线笔试题 大于非负整数N的第一个回文数 Symmetric Number
1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 这个题目也是当时笔试第一次见到,花了一个小时才做出了.慢慢总结还是挺简单的. 2.分析 分析如下: (1)一位数N(9 ...
- leetcode9_C++判断一个整数是否是回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 输出: true 示例 2: 输入: - 输出: false 解释: 从左向右读, 为 - ...
- 判断一个整数是否是回文数C++实现 leetcode系列(九)
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数
各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...
- luogu10125回文数[noip1999 Day1 T1]
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
- 合工大OJ 1331 回文数
Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数. 任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数, ...
随机推荐
- JSON解析器之jackson json数据和java对象转换
- java模拟多线程
public class HTTPRequest implements Runnable { public void run() { //这里实现发送请求 } public static void ...
- Python网络编程之基础
计算机网络基础 网络到底是什么?计算机之间如何通信的? 早期:联机 以太网:局域网与交换机 ******广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发, 所 ...
- ubuntu上安装ansible
1 在最新的ubuntu系统上安装ansible : sudo ape-get install ansible 2 切换到root用户 生成ssh免密登陆 ssh-keygen -t rsa ssh- ...
- CQRS之旅——前言(翻译)
探索CQRS和Event Sourcing 本项目聚焦在使用命令和查询分离模式和事件溯源(CQRS+Event Sourcing)构建一个具有高扩展,高可用和高维护性的应用程序. 本项目定位为一个学习 ...
- 求一个极大数的欧拉函数 phi(i)
思路: 因为当n>=1e10的时候,线性筛就不好使啦.所以要用一个公式 φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 证明详见:<公式 ...
- awk对列求和
awk 'BEGIN{total=0}{total+=$1}END{print total}' 文件名
- Java中protected方法访问权限的问题
先看Test.java 此时出现上文提到的错误:The method clone from the type Object is not visiuable. 我们已经清楚Object.clone() ...
- SqlServer 填充因子的说明
CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfactor=30 使用 fill factor 选项可以指定 M ...
- python_104_面向对象总结
参考(都要认真看看):http://www.cnblogs.com/alex3714/articles/5188179.html http://www.cnblogs.com/alex3714/art ...