URAL - 1123 Salary(水题)

比赛中没作出来的大水题~~

题意:

给定一个数字,查找大于等于该数字的最小的回文数字。

思路:

在纸上画画,就知道规律了,回文串以前面不变为原则,这样才能保证最接近原数字的。例如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;
}


posted on 2013-07-31 15:08  Primo...  阅读(166)  评论(0编辑  收藏  举报