题目描述
回文数是从左向右读和从右向左读结果一样的数字串。
例如: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