题目描述
回文数是从左向右读和从右向左读结果一样的数字串。
例如:121、44 和3是回文数,175和36不是。
对于一个给定的N,请你寻找一个回文数P,满足P>N。
满足这样条件的回文数很多,你的任务是输出其中最小的一个。
输入格式
1行,一个正整数N。N的数值小于10^100,并且N没有前导0。
输出格式
你的程序应该输出一行,最小的回文数P(P>N)。
输入输出样例
输入 #1
44
输出 #1
55
说明/提示
50%的数据,N<10^9
100%的数据,N<10^100
输入一个整数 ABCD ,若整数ABBA 比 ABCD 大,则 ABBA 就是比它大的最小回文数,然后就可以直接输出这个答案了。
而如果 ABBA 比 ABCD 要小(或等于)那我们就要找到比 ABBA 大的下一个回文数。
不难发现它就是:ACCA 且 C=B+1。
#include<cstdio>
#include<cstring>
using namespace std;
char a[1002];
int b[1002],s[1002],t[1002];
int l,mid1,ls=0;
void add(){
int i,x,y;
i=mid1+1;
x=b[i]+1;
b[i]=x%10;
y=i;
if(l%2==0){
b[i-1]=b[i];
y=i-1;
}
while(x>9){
i++;
x=b[i]+1;
b[i]=x%10;
y--;
x=b[y]+1;
b[y]=x%10;
}
}
void hw(){
int top=0,j,next;
for(j=0;j<=mid1;j++){
s[++top]=b[j];
}
if(l%2==0){
next=mid1+1;
}
else{
next=mid1+2;
}
for(j=next;j<l;j++){
t[top]=b[j];
ls++;
top--;
}
for(j=0;j<=mid1;j++){
b[j]=t[++top];
}
}
int com(){
int i;
for(i=ls;i;i--){
if(s[i]<t[i])
return 0;
else{
if(s[i]>t[i]){
return 1;
}
}
}
return 1;
}
int main(){
int i,p;
scanf("%s",a);
l=strlen(a);
for(i=0;i<l;i++){
b[i]=a[l-i-1]-'0';
}
for(p=0;p<l;p++){
if(b[p]!=9){
break;
}
}
if(p==l){
printf("1");
for(i=0;i<l-1;i++){
printf("0");
}
printf("1");
return 0;
}
mid1=l/2-1;
hw();
if(com()){
add();
}
for(i=l-1;i>=0;i--){
printf("%d",b[i]);
}
return 0;
}
来源:https://www.cnblogs.com/hrj1/p/11186114.html