题目描述:
回文数是从左向右读和从右向左读结果一样的数字串,例如:1和363都是回文数。
编写一个程序,构造一个大于给定正整数n的最小回文数P。
输入格式:
一个正整数n。
输出格式:
一个回文数P。
样例输入:
样例1: 9999 样例2: 1234567 样例3: 1299945 样例4: 12993682
样例输出:
样例1: 10001 样例2: 1235321 样例3: 1300031 样例4: 12999921
提示:
1<=n<=10^100
时间限制: 1000ms
空间限制: 256MB
代码如下:
#include<bits/stdc++.h>
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;
cin>>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){
cout<<1;
for(i=0;i<l-1;i++){
cout<<0;
}
cout<<1;
return 0;
}
mid1=l/2-1;
hw();
if(com()){
add();
}
for(i=l-1;i>=0;i--){
cout<<b[i];
}
return 0;
}