/*建议复制到编译器打开 方便观看
思路分析:考虑给定数字的中左数(中间偏左第一个数)和中右数的大小情况
1.若中左大于中右,则可直接打印中左,中间数(若为偶数则无需打印),中左倒序数
2.若中左小于等于中右,则对中数(数位为奇)(或中左(数位为偶))进行++操作
若++后大于9 则原来中左等于中右等于9,或中数等于9,赋值0,接着对中左或中数的前一位数进行相同操作,直到找到一个<=8的数字,进行++操作后即可跳至打印操作*/
# include<stdio.h>
# include<string.h>
int main() {
char a[10005];
while (~scanf("%s", a)) {
int len = strlen(a);
int flag = 0;//初始变量声明,flag默认为0,便于下面合并中左<=中右的情况
for (int i = len / 2 - 1; i >= 0; i--) {
if (a[i] > a[len - i - 1]) {
flag = 1;
break;
} else if (a[i] < a[len - i - 1]) {
flag = 0;
break;
}//判断中左与中右
}
if (!flag) {//若中左小于等于中右
for (int i = (len - 1) / 2; i >= 0; i--) {
a[i]++;
if (a[i] > '9')
a[i] = '0';
else
break;
}//处理中左或其左边为9需进位的情况
if (a[0] == '0') {
a[0] = '1';
len++;//扩位为打印做准备
a[len / 2] = '0';
}//若首位为0 则原中左至首位皆为9,仅需打印1000..1 确定位数即可
}
for (int i = 0; i < len / 2; i++)
printf("%c", a[i]);//打印首位至中左的所有字符
for (int i = (len + 1) / 2 - 1; i >= 0; i--)
printf("%c", a[i]);//倒序 从中或中右往回打
printf("\n");
}
return 0;
}
总结:考虑相邻的回文数时,从中左,中,中右三个位置入手