题目详情 Njzy在对回文数的学习过程中发现了一个有趣的问题. 这个问题是求一个数的回文距离。一个数的回文距离的定义是它减去一个回文数的绝对值的最小值。 比如:121的回文距离就是0,因为|121-121|=0,123的回文距离是2,|123-121|=2 输入描述: 输入包含多组测试数据,每组测试数据包含一个整数a, (0<a<10^18)。 输出描述: 对于每组测试数据输出相应的答案。 答题说明 输入样例: 121 123 输出样例: 0 2 思路:主要就是求出最靠近a的回文值x, y(一个在a点左边,一个在右边),然后判断x、y哪个更靠近a。 通过数值a的左半端,我们可以构造出一个回文点x, 1. 如果x<=a, 那么通过a的左半端加1构造出y。 2. 如果x>a, 那么通过a的左半端减1构造出y。 代码如下: #include <iostream> #include <climits> #include <cmath> #include <algorithm> #include <iomanip> #include <vector> #include <bitset> #include <cstdio> #include <cstdlib> #define inf 0x7fffffff #define MOD 1000000007 using namespace std; inline __int64 myMin(__int64 a, __int64 b) { return a < b ? a : b; } inline __int64 myAbs(__int64 a) { return a < 0 ? -a : a; } int len(__int64 num) { int res = 0; while(num != 0) { num /= 10; res++; } return res; } __int64 produce(__int64 num, bool isEvenLen) { __int64 num1; if(isEvenLen) { num1 = num; } else { num1 = num/10; } while(num1 > 0) { num = num*10 + num1%10; num1 /= 10; } return num; } int main() { __int64 a, res; while(scanf("%I64d", &a) != EOF){ res = a; int l = len(a); if(l%2 == 0) { __int64 num = a / pow(10, l/2 * 1.0); __int64 num1 = produce(num, true); res = myMin(res, myAbs(a - num1)); if(a > num1) { num1 = num + 1; num1 = produce(num1, len(num) == len(num1)); res = myMin(res, myAbs(a - num1)); } else { num1 = num - 1; num1 = produce(num1, len(num) == len(num1)); res = myMin(res, myAbs(a - num1)); } } else { __int64 num = a / pow(10, l/2 * 1.0); __int64 num1 = produce(num, false); res = myMin(res, myAbs(a - num1)); if(a > num1) { num1 = num + 1; num1 = produce(num1, len(num1) != len(num)); res = myMin(res, myAbs(a - num1)); } else { num1 = num - 1; num1 = produce(num1, len(num1) != len(num)); res = myMin(res, myAbs(a - num1)); } } printf("%I64d\n", res); } return 0; }