大于某个数K的最小回文数,做的很纠结~对很多python细节还不是很熟。测试了找到的所有用例,结果是对的,但提交是TLE,暂时不管了,先放到这了。
主要分K中数字为1个和多个两种情况考虑
1. 如果K只含有一个数字,则结果就为K+1,当K=9时结果为11
2. 当数字个数大于1时,将K分为两部分,并将前半部分对称到后半部分得到P。这个时候又要考虑两种情况:
a. 如果得到的新数字P>K,则P就是大于K的最小回文数,因为P和K的前半部分是一样的,而后半部分又是前半部分的对称,所以P和K之间不会再有比P小的回文数了。
b. 如果得到的新数字P<K,则需要从P的中间增加数字来得到新的回文数P‘,因为根据回文数两头对称的特点,增加中间的数才能得到最小的回文数。
t=input()
while t:
K=raw_input()
l=len(K)
if l==1:
if K[0]<'9':
print str(int(K[0])+1)
else:
print '11'
else:
P=list(K)
rng=l>>1
if l%2==1:
rng+=1
for i in range(rng):
P[l-i-1]=K[i]
if cmp(''.join(P),K)<=0:
i=l>>1
while i<l:
n=int(P[i])+1
if n>9:
P[i]='0'
i+=1
else:
P[i]=str(n)
break;
if i==l: P.append('1')
K=[]
l=len(P)
rng=l>>1
for i in range(rng):
K.append(P[l-i-1])
for i in range(rng,l):
K.append(P[i])
print ''.join(K)
else:
print ''.join(P)
t-=1
网上找到的相关资料。
http://www.java3z.com/cwbwebhome/article/article5/5991.html
http://wenwen.soso.com/z/q185475753.htm
http://galaas.blogbus.com/tag/%E6%9C%80%E5%B0%8F%E5%9B%9E%E6%96%87%E6%95%B0/
1. 关于python源文件中的编码问题
python的源码默认是ascii编码,所以如果有中文的话会出现异常(source code exception什么的),所以如果想在源码中加入中文需要指明编码,编码说明必须要写在文件的第一行或第二行。具体可以参考:http://www.python.org/dev/peps/pep-0263/
2. python中没有指针
3. python中的字符串操作:http://www.pythonclub.org/python-basic/string
4. python中的字符不能直接和整数做运算,需要str(int(c)+1)
5. python中的字符串不能更改(类似于char *s="aaa"),字符型的list和字符串之间的转换: 字符串-->list:s=list(s) list-->字符串:‘’.join(l)
用C写的AC代码:
#include <stdio.h>
#include <string.h>
int main()
{
int t,len,l,m,r,c,cur;
char K[1000001],tmp[1000001];
scanf("%d",&t);
while(t--)
{
memset(K,0,sizeof(K));
memset(tmp,0,sizeof(tmp));
scanf("%s",K);
len=strlen(K);
if(len==1&&K[0]<'9')
printf("%c\n",K[0]+1);
else if(len==1)
printf("11\n");
else
{
strcpy(tmp,K);
for(l=0,r=len-1;l<r;l++,r--) tmp[r]=tmp[l];
if(strcmp(tmp,K)>0)
printf("%s\n",tmp);
else
{
cur=m=len>>1;
tmp[cur]+=1;
c=(tmp[cur]>'9')?1:0;
for(;c&&cur<len;cur++)
{
tmp[cur]='0';
tmp[cur+1]+=1;
c=(tmp[cur+1]>'9')?1:0;
}
if(cur==len) tmp[len++]='1';
for(l=0,r=len-1;r>=m;l++,r--) K[l]=tmp[r];
l=(len&0x1)?(m+1):m;
for(;l<len;l++) K[l]=tmp[l];
printf("%s\n",K);
}
}
}
return 0;
}