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