题目描述
如果给定一个对称数n,请你求出大于n的最小对称数(即这个数从左向右读和从右向左读是完全一样的)。
输入
第一行输入t(0<t<19999);
接下来的t行,每行输入一个n(0<n<10^9)。
输出
与输入相对应,每行输出一个大于n的最小对称数m
解题思路:输入的为对称数,分类讨论,针对个位、及全是9、不全为9,三种情况处理,用字符串处理。
算法步骤:1、输入的x为个位,如果不是9则,所求数为int(x+1),否所求数为11。
2、如果全为9且大于一位,如99改为101,999改为1001。
3、不全为9,还要分奇、偶。具体实现如下。
#include<stdio.h>
int main()
{
char s[20];
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
len=strlen(s);
if(len==1)//个位数
{
if(s[0]=='9')
printf("11\n");
else
printf("%d\n",s[0]-'0'+1);
}
else
{
//判断是否全部为9;999->1001
for(i=0; s[i]; i++)
{
if(s[i]!='9')
break;
}
if(i==len)
{
for(i=0; i<=len; i++)
{
if(i==0||i==len)
s[i]='1';
else
s[i]='0';
}
s[len+1]='\0';
}
else
{
//len为偶数,123321->124421;129921->130031;
if(len%2==0)
{
mid=len/2;
s[mid]+=1;
s[mid-1]+=1;
for(i=mid;i<len;i++)
{
if(s[i]==58)
{
s[i]='0';
s[i+1]+=1;
s[len-i-1]='0';
s[len-i-2]+=1;
}
}
}
else
{
mid=len/2;
s[mid]+=1;
if(s[mid]==58)
{
s[mid]='0';
s[mid+1]+=1;
s[mid-1]+=1;
for(i=mid+1;i<len;i++)
{
if(s[i]==58)
{
s[i]='0';
s[i+1]+=1;
s[len-1-i]='0';
s[len-2-i]+=1;
}
}
}
}
}
puts(s);
}
}
return 0;
}