输入一个数,找到比该数大的最小回文数

 解题思路主要是从回文数的构造出发,貌似一般与回文数有关的都是构造回文数,而不是去搜索。

 分为多种情况:

A. 该数的长度是奇数(只有1位很好办,除9外直接加1,9的话输出11),取出该数的前半截(包括中间数),

     1.若该数是回文数,则用前半截数值加1,之后再构造新的回文数;

     2.不是回文数,从中间往两边找到第一个不相等(因为不是回文数,所以肯定能找到)的数,若前面的小于后面的,则按1处理(用前半截数值加1,之后再构造新的回文数);

      若前面的大于后面的,则直接用前半截来构造回文数。

B. 该数的长度是偶数,取出前半截(正好是一半),思路和奇数的差不多, 如果是回文数或前半截小,则把前半截+1后的数构造回文数;若前半截大,则直接用前半截构造回文数。

代码: 

  

  1 void ff(int n)          
  2 {
  3     if (n < 0)     
  4     {
  5         cout<<'0'<<endl;
  6         return;
  7     }
  8     char str[20];
  9     char temp[15];
 10     itoa(n,str,10);
 11     int len = strlen(str);
 12     if (len == 1)         //长度为1
 13     {
 14         if (n == 9)           //若n为9 则最近回文数为11
 15         {
 16             cout<<"11"<<endl;
 17         }
 18         else                  //若n比9小 则为n+1
 19         {
 20             cout<<n+1<<endl;
 21         }
 22     }
 23     else if (len%2 == 1)     //长度大于1且为奇数
 24     {
 25         for (int i = 0;i < len/2 + 1;++i)        //保存其前半部分 包括中间数
 26         {
 27             temp[i] = str[i];
 28         }
 29         temp[len/2 + 1] = '\0';
 30         int i,j;
 31         for (i = len/2 -1 ,j = len/2 + 1;j < len;--i,++j)
 32         {
 33             if (str[i] != str[j])
 34             {
 35                 break;
 36             }
 37         }
 38         if (j == len||str[i] < str[j])     //n是回文数 或不是回文数但其前半部分小
 39         {
 40             int num = atoi(temp);       //则前半部分数值+1 再用前半部分构造回文数
 41             ++num;
 42             itoa(num,temp,10);
 43             cout<<num;                        
 44             for (int i = len/2 -1;i >= 0;--i)           
 45             {
 46                 cout<<temp[i];
 47             }
 48             cout<<endl;
 49         }
 50         else                   //不是回文数 但前半部分大
 51         {
 52             cout<<temp;                          //则用前半部分构造回文数
 53             for (int i = len/2 - 1;i >= 0; --i)
 54             {
 55                 cout<<temp[i];
 56             }
 57             cout<<endl;
 58         }
 59     }    
 60     else                   //长度大于1且为偶数
 61     {
 62         for (int i = 0 ; i < len/2 ;++i)       //保存前半部分
 63         {
 64             temp[i] = str[i];
 65         }
 66         temp[len/2] = 0;
 67         if (str[len/2 - 1] == str[len/2])             //有可能是回文数
 68         {
 69             int i,j;
 70             for (i = len/2 - 1,j = len/2;j < len;++j,--i)
 71             {
 72                 if (str[i] != str[j])
 73                 {
 74                     break;
 75                 }
 76             }
 77             if (j == len||str[i] < str[j])  //n是回文数 或不是回文数但其前半部分小
 78             {                                    //则前数加1  用前半部分构造
 79                 int num = atoi(temp);       //则前半部分数值+1 再用前半部分构造回文数
 80                 ++num;
 81                 itoa(num,temp,10);
 82                 cout<<num;                        
 83                 for (int i = len/2 - 1;i >= 0;--i)           
 84                 {
 85                     cout<<temp[i];
 86                 }
 87                 cout<<endl;
 88             }
 89             else                               //不是回文数但其前半部分大
 90             {
 91                 cout<<temp;                   //直接用前半部分构造
 92                 for (int i = len/2 - 1;i >= 0;--i)
 93                 {
 94                     cout<<temp[i];
 95                 }
 96                 cout<<endl;
 97             }
 98         }
 99         else if (str[len/2 - 1] < str[len/2])          //中间靠前的数比后面的小
100         {                                              //则前数加1  用前半部分构造
101             temp[len/2 - 1] = char(temp[len/2 - 1] + 1);
102             cout<<temp;
103             for (int i = len/2 - 1;i >= 0;--i)
104             {
105                 cout<<temp[i];
106             }
107             cout<<endl;
108         }
109         else                                       //中间靠前的数比后面的大
110         {                                          //则直接用前半部分构造
111             cout<<temp;
112             for (int i = len/2 - 1;i >= 0;--i)
113             {
114                 cout<<temp[i];
115             }
116             cout<<endl;
117         }
118     }
119     
120 }

PS: 花花供题

   

原文地址:https://www.cnblogs.com/itachi7/p/2574481.html