题目描述
如果给定一个对称数n,请你求出大于n的最小对称数(即这个数从左向右读和从右向左读是完全一样的)。
输入
第一行输入t(0<t<19999);
接下来的t行,每行输入一个n(0<n<10^9)。
输出
与输入相对应,每行输出一个大于n的最小对称数m。
样例输入
6
1
11
99
789987
123454321
999999999
样例输出
2
22
101
790097
123464321
1000000001
思路:求一个回文数的下一个最下回文数
1.数据的输入用字符数组,便于处理每一位数字。
2.对数据的位数分奇数偶数处理
奇数:取一半加中间数。
偶数:取一半。
然后对取的数+1,再进行输出,输出的时候注意特殊数据
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char s[500];
int str[500],mid,num,output[500];
int judge(int r) //判断是否进位例:99+1=100或999+1=1000
{ int inum=0,i=0,result=r;
while(r!=0)
{
r/=10;
inum++;
}
if(num%2!=0)
return inum>mid+1?1:0;
else
return inum>mid?1:0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{ int sum;
scanf("%s",s);
num=strlen(s);
for(int i=0;i<strlen(s);i++)
{
str[i]=s[i]-'0';
sum=sum*10+str[i];
}
//转换数组
mid=num/2;
int left=0;
if(num%2==0)
for(int i=0;i<mid;i++)
left=left*10+str[i];
else
for(int i=0;i<=mid;i++)
left=left*10+str[i];
//算出取一半的数构造回文数
int r=left+1,result=r,j=0;//算出一半+1
while(r!=0)
{
output[j++]=r%10;
r/=10;
}
if(num==1&&sum!=9) //特殊数据的处理1--8
printf("%d",str[0]+1);
else if(sum==11) //特殊数据的处理11
printf("22");
else if(sum==9) //特殊数据的处理9
printf("10");
else if(num%2==1){ //处理位数是奇位数的数据
if(judge(result))
{ printf("%d",result/10);
for(int i=1;i!=j;i++)
printf("%d",output[i]);
}
else {
printf("%d",result);
for(int i=1;i!=j;i++)
printf("%d",output[i]);
}
}
else{ //处理位数是偶位数的数据
if(judge(result)){
printf("%d",result);
for(int i=1;i!=j;i++)
printf("%d",output[i]);
}
else{printf("%d",result);
for(int i=0;i!=j;i++)
printf("%d",output[i]);
}
}
printf("\n");
}
}