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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值