(SPOJ5)The Next Palindrome

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

算法:

由于数据较大,只能采用字符数组存储输入字符串

(1)判断字符串s是否是全9字符串“9999....99”,若是,直接打印“1(len(s)-1个0)1”

(2)将字符串均分为2个部分,中心位置为p,若len为奇数,p=len/2;若len为偶数,p=len/2-1;

(3)若前半部分的所有字符s[i]都大于后半部分的相应字符s[len-i-1],直接将前半部分的字符复制到后半部分的相应位置;

(4)若前半部分的字符至少有一个字符小于后半部分的相应字符或是字符串本身就是回文数,则将中间位置的字符p+=1,若有进位,依次向前进位,直到 i=0,最后将前半部分的字符复制到后半部分的相应位置;

代码如下:

  1 #include <stdio.h>
  2 #include <math.h>
  3 #include <string.h>
  4 #include <ctype.h>
  5 
  6 char a[1000001];
  7 
  8 void deal(char *s)
  9 {
 10     int i,j,len,flag1,flag2,temp,flag,sum,L;
 11     flag1=flag2=flag=1;
 12     sum=0;
 13     len=strlen(s);
 14     L=len/2-1; 
 15     for(i=0; i<len; i++)
 16     {
 17         if(s[i]!='9')
 18         {
 19           flag1=0;  //判断s[i]是否都为'9' 
 20           break;
 21         }
 22     }
 23     for(i=0; i<=L; i++)
 24     {
 25         if(s[i]<s[len-1-i])
 26         {
 27             flag2=0;
 28         }
 29         else if(s[i]==s[len-1-i])
 30         {
 31             sum++;
 32         }
 33         s[len-1-i]=s[i];
 34     }
 35     if(sum==len/2)
 36     {
 37         flag2=0;
 38     }  
 39     if(len==1)
 40     {
 41         printf("11\n");
 42         return;
 43     }
 44     else
 45     {
 46         if(flag1)   //s为999....999 
 47         {
 48             printf("1");
 49             for(j=0; j<len-1; j++)
 50              printf("0");
 51             printf("1\n");
 52             return;
 53         }
 54         else
 55         {
 56           if(flag2)
 57           {
 58             printf("%s\n",s);
 59           }
 60           else
 61           {
 62               if(len%2)
 63               {
 64                 i=len/2;
 65               }
 66               else
 67               {
 68                   i=len/2-1;
 69               }
 70               while(i>-1)
 71               {    
 72                   if(s[i]=='9')
 73                   {
 74                       s[i]='0';
 75                   }
 76                   else
 77                   {
 78                     s[i]=s[i]+1;
 79                   break;    
 80                   }
 81                   i--;
 82               }
 83               for(i=0; i<len/2; i++)
 84               {
 85                  s[len-1-i]=s[i];
 86               }
 87               printf("%s\n",s);
 88           }
 89     
 90         }
 91     }
 92     
 93 }
 94 
 95 void solve()
 96 {
 97     int t,n;
 98     scanf("%d",&t);
 99     getchar();
100     while(t--)
101     {
102         gets(a);
103         deal(a);
104     }
105 }
106 
107 int main()
108 {
109   solve();
110   return 0;
111 }
【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/cpoint/p/3023063.html