計算第N位的形如12321的可逆數(shù)

我是先把1位,2位~100位數(shù)中各含幾個可逆數(shù)算出來,計入數(shù)組num,然后根據(jù)輸入的N位置,算出該數(shù)有幾位,并處于什么位置。依次通過取整取余得出結果。

如要求出第24位,因為1位數(shù)和2位數(shù)中各含9個可逆數(shù),所以所要求的數(shù)位于3位數(shù)中的第6個
先用6對num【1】取整(三位數(shù)的個數(shù)其實就是最高和最低位從1到9,而中間只是1位數(shù)的個數(shù)加1(0)),
取整后得0,而0代表第一組1位數(shù),所以應該加1,從而將1放入我們要輸出的數(shù)組。接著6對num【1】取余后是6,因為已經(jīng)是最中間位了,所以就把5存入。輸出后得出151!

期間我也得到了很多WA,是因為沒有考慮到一些情況,大家要仔細?。。?!

#include <iostream>
#include 
<string>
#include 
<vector>
#include 
<cmath>
#include 
<algorithm>
using namespace std;

long long int num[101];

int main()
{
    num[
1]=9;num[2]=9;int j=0,k=0;
    
for (int i=3;i<=100;i++)    //相應位數(shù)中有多少個對稱數(shù)
    {
        
if (i%2==1)
        
{
            num[i]
=9*(num[i-2]+pow(10.0,j++));
        }

        
else
        
{
            num[i]
=9*(num[i-2]+pow(10.0,k++));
        }

    }

    
long long int n;
    
while (scanf("%lld",&n)!=EOF&&n)
    
{
        
long long int sum=0,index;
        
int len;
        
for (int i=1;i<101;i++)   //計算位數(shù)
        {
            sum
+=num[i];
            
if (n<=sum)
            
{
                len
=i;
                sum
-=num[i];
                
break;
            }

        }

        index
=n-sum;     
        
char output[100];
        
int kk=0;bool start=true;
        
for (int j=len;j>0;j-=2)
        
{
            
if ((j==1||j==2)&&start)  //一位或二位時直接記錄
            {
                output[kk
++]=index+'0';
                
break;
            }

            
if ((j==1||j==2)&&start==false)
            
{
                
if (index==0)    //余數(shù)為0時剛好為該位數(shù)中的最大數(shù)
                  output[kk++]='9';
                
else
                  output[kk
++]=index+'0'-1;
                
break;
            }

            
if(len%2==1)   //位數(shù)為奇數(shù)時
            {
                
if(start)
                   output[kk
++]=index/(num[j-2]+(long long int)pow(10.0,(j-1)/2-1))+'0'+1;  //開始時若整除為零,實際上是1
                else
                   output[kk
++]=index/(num[j-2]+(long long int)pow(10.0,(j-1)/2-1))+'0';
                index
%=(num[j-2]+(long long int)pow(10.0,(j-1)/2-1));
                
if (index==0&&output[kk-1]!='0')
                   output[kk
-1]-=1;
                
else if (index==0&&output[kk-1]=='0')  //余數(shù)為零即最大值
                   output[kk-1]='9';
                start
=false;
            }

            
else
            
{
                
if(start)
                   output[kk
++]=index/(num[j-2]+(long long int)pow(10.0,(j-2)/2-1))+'0'+1;
                
else
                   output[kk
++]=index/(num[j-2]+(long long int)pow(10.0,(j-2)/2-1))+'0';
               index
%=(num[j-2]+(long long int)pow(10.0,(j-2)/2-1));
               
if (index==0&&output[kk-1]!='0')
                   output[kk
-1]-=1;
               
else if (index==0&&output[kk-1]=='0')
                   output[kk
-1]='9';
               start
=false;
            }

        }

        
for (int i=0;i<len/2;i++)
        
{
            printf(
"%c",output[i]);
        }

        
if (len%2==1)
        
{
            
for (int i=len/2;i>=0;i--)
            
{
                printf(
"%c",output[i]);
            }

        }

        
else
        
{
            
for (int i=len/2-1;i>=0;i--)
            
{
                printf(
"%c",output[i]);
            }

        }

        printf(
"\n");
    }

}