码迷,mamicode.com
首页 > 其他好文 > 详细

SPOJ:The Next Palindrome(思维)

时间:2018-04-19 19:13:50      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:str   std   cer   pre   called   careful   cout   lines   display   

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.

Input

The first line contains integer t, the number of test cases. Integers K are given in the next t lines.

Output

For each K, output the smallest palindrome larger than K.

Example

Input:
2
808
2133

Output:
818
2222

Warning: large Input/Output data, be careful with certain languages

 

题意:输出比X大的第一个回文字符串。

思路:先把X按左半边为标准变成一个回文串X2,如果X2大于X,则输出X2。 否则变大X2 :

           如果X2全部为9,则需要加一位,变为首尾为‘1’,之间为‘0’的回文串。

           否则,从之间开始找第一位非‘9’的位置,自加1。然后中间取余变为‘0’。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000010;
char c[maxn],c2[maxn];
int T,N,Len,a[maxn];
bool check9()
{
    for(int i=1;i<=Len;i++)
     if(c[i]!=9) return false;
    return true;
}
void Tochange()
{
    for(int i=1;i<=Len/2;i++) c2[i]=c[i];
    for(int i=Len/2+1;i<=Len;i++) c2[i]=c[Len+1-i];
}
bool Toupper()
{
    for(int i=1;i<=Len;i++) 
        if(c2[i]>c[i]) return true;
        else if(c2[i]<c[i]) return false; 
    return false;
}
int main()
{
    int i,j;
    scanf("%d",&T);
    while(T--){
        scanf("%s",c+1);
        Len=strlen(c+1);
        Tochange();
        if(Toupper()) {
            for(i=1;i<=Len;i++) putchar(c2[i]);
            cout<<endl;
            continue;
        }
        if(check9()) {
            putchar(1);
            for(i=1;i<Len;i++) putchar(0);
            putchar(1);
            cout<<endl;
            continue;
        }
         int np,Mid;
        if(Len&1) Mid=(Len+1)/2;
        else Mid=Len/2;
        for(np=Mid;np>=1;np--) if(c[np]!=9) break;
          c[np]++;
        for(i=np+1;i<=Mid;i++) c[i]=0;
        for(i=1;i<=Mid;i++) putchar(c[i]);
        for(i=Len/2;i>=1;i--) putchar(c[i]);
        cout<<endl;        
    }
    return 0;
}

 

SPOJ:The Next Palindrome(思维)

标签:str   std   cer   pre   called   careful   cout   lines   display   

原文地址:https://www.cnblogs.com/hua-dong/p/8885351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!