5. The Next Palindrome

[size=large][align=center]The Next Palindrome[/align][/size]
题目:A positive integer is called a palindrome if its representation in the decimal system is the same when read from left to right and from right to left. For a given positive integer K of not more than 1000000 digits, write the value of the smallest palindrome larger than K to output. Numbers are always displayed without leading zeros.
题目分析:这题与上次华中南赛区的一个题目一样,曾记得当时我一看到这样的题目就不想做,觉得很麻烦,所以马上果断地扔给zsq做,唉,这也反映出我一向的怪毛病,碰到麻烦题就不想做。这次再次做这个题目,发现只要把这个题目的思路好好的想清楚,写代码还是挺快,其实也不是很长,一交,局然神奇般的1Y :D
题目思路其实很简单,首先考虑特殊情况。当k<9时,直接输出k+1;当k各位全部都是9时,如k=9999,直接输出10001。
其它情况,我们可以肯定输出的值最多也就是全部都是9,也就是说最后一位来处理时肯定不会超过9,所以不需要处理最后一位的进位问题。
首先按k的位数分为奇数、偶数两种情况对称处理。按照对称位置,低位服从于高位,即不管低位的值是什么,全部都改为与对称的高位的值相同。这时可能会出现数k的值会减少,这时通过中间位加1,然后处理相关进位问题即可。

//贪心+模拟
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1000010;
char k[maxn];
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
gets(k);
int len=strlen(k);
if(len==1)
{
if(k[0]>='0'&&k[0]<='8') putchar(k[0]+1);
else puts("11");
continue;
}
int i;
for(i=0;i<len;i++)
{
if(k[i]!='9') break;
}
if(i>=len)
{
putchar('1');
for(int i=1;i<len;i++) putchar('0');
puts("1");
continue;
}
k[len-1]++;
for(int i=len-1;i>=0;i--)
{
if(k[i]-'0'>9) k[i]='0',k[i-1]++;
else break;
}
if(len&1)
{//处理奇数的情况
int mid=len/2;
bool flag=false;//用于标记数k是否变小啦
for(int i=len-1;i>mid;i--)
{
if(k[i]>k[2*mid-i]) flag=true;//数k变小
k[i]=k[2*mid-i];
}
if(flag)
{//数k比原数小,需要调整
k[mid]++;
int l=mid;
while(l>=0)
{
if(k[l]-'0'>9)
{
k[l]=k[2*mid-l]='0';
k[l-1]++,k[2*mid-(l-1)]++;
l--;
}
else break;
}
}
puts(k);
}
else
{//处理偶数的情况
int mid=len/2;
bool flag=false;//用于标记数k是否变小啦
for(int i=len-1;i>=mid;i--)
{
int j=2*mid-i-1;
if(k[i]>k[j]) flag=true;//数k变小
k[i]=k[j];
}
if(flag)
{//数k比原数小,需要调整
int i=mid,j=mid-1;
k[i]++,k[j]++;
while(i<len&&j>=0)
{
if(k[i]-'0'>9)
{
k[i]=k[j]='0';
k[i+1]++,k[j-1]++;
i++,j--;
}
else break;
}
}
puts(k);
}
}
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值