比赛中没作出来的大水题~~
题意:
给定一个数字,查找大于等于该数字的最小的回文数字。
思路:
在纸上画画,就知道规律了,回文串以前面不变为原则,这样才能保证最接近原数字的。例如123111要变成123321,但如果123456这样的该怎么办呢。
第一步也是变成123321,但是我们发现这样反而变小了,这是因为对应的数位上前面的数字比后面的数字小,这样我们应该从最中间的数字把这个给加上去,反之,如果前面的数字比后面的大,则不用进位,而且如果前面进位标志如果是1的话,则把进位标识改成0即可。因为此时的高位数字变大,已经弥补了前面的进位误差。
例如909090
第二位上是0,比倒数第二位上的数字小,则进位标志写作1,
第三位上是9,比倒数第三位上的数字大,而且此时的进位标志是1,所以要把进位标志改作0,
所以最后结果:909909;
所以:
第二步就变成了124421,还有如果最中间的数字是9的话该怎么办呢 9+1 = 10 了,同理,我们对这些数字进位,把该位数字置为0,前面的数字加1,如果前面的还是9的话,进位方式相同。不再赘述。举个例子
19992 -----> 19991(第一步)
19991 ------> 20002(第二部)
代码入下:
#include <cstdio>
#include <cstring>
#define M 2010
char str[M];
int main ()
{
scanf("%s",str);
int len = strlen(str), flag = 0;
for(int i = 0; i <= (len-1)/2; ++i)
{
if(str[i]!=str[len-1-i])
{
if(str[i]<str[len-1-i])
flag = 1;
else if(flag)
flag-=1;
str[len-1-i] = str[i];
}
}
if(flag) //如果需要进位的话
{
for(int i = (len-1)/2; flag &&i >= 0; --i)
{
str[i]+=1;
str[len-1-i] = str[i];
flag = 0;
if(str[i]>'9')
{
str[i] = str[len-1-i] = '0';
flag = 1;
}
}
}
puts(str);
return 0;
}