lightOJ 1396 - Palindromic Numbers (III)(回文数)

来源:互联网 发布:全景动画制作软件 编辑:程序博客网 时间:2024/06/06 15:04

题意:找出比给定数大一点点的回文数;


#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <queue>#include <stack>using namespace std;int a[100005],b[100005];char ch[100005];bool judge(int len){    for(int i=0;i<len;i++)    if(a[i]!=9) return false;    return true;}void solve(){    int len = strlen(ch);    for(int i=0;i<len;i++)    a[i] = ch[i]-'0';    int tmp = -1;    for(int i=0;i<len;i++)    if(a[i])    {        tmp = i;        break;    }    if(tmp==-1)    {        a[0] = 0;len = 1;    }else    {        for(int i=0;i+tmp<len;i++)        a[i] = a[i+tmp];        len-=tmp;    }    if(judge(len))    {        for(int i=0;i<=len;i++)        if(i==0||i==len)        printf("1");        else        printf("0");printf("\n");        return ;    }    int p=0;    int k = 0;    int mid = len>>1;    for(int i=len-1;i>=mid;i--)    {        int c = len - i - 1;        if(a[i]!=a[c]) k = 1;        if(a[c]>=a[i]+p)        {            a[i] = a[c];p=0;        }else        {            p = 1;            a[i] = a[c];        }    }    if(k==0||p)    {        if(len&1)        {            for(int i=(len>>1);i>=0;i--)            if(a[i]==9)            {                a[i] = a[len-i-1] = 0;            }else            {                a[i]=a[len-i-1] = a[i]+1;                break;            }        }        else        {            for(int i=(len>>1)-1;i>=0;i--)            if(a[i]==9)            {                a[i] = a[len-i-1] = 0;            }else            {                a[i]=a[len-i-1] = a[i]+1;                break;            }        }    }    for(int i=0;i<len;i++)    {        printf("%d",a[i]);    }printf("\n");}int main(){    freopen("in.txt","r",stdin);    int cas,T=1;    scanf("%d",&cas);    while(cas--)    {        scanf("%s",ch);        printf("Case %d: ",T++);        solve();    }    return 0;}