rqnoj 148 回文数

rqnoj 148 回文数
Here is my code:
#include < iostream >
#include
< string >
#include
< string .h >
#define  maxn 1007
using   namespace  std;

typedef 
struct
{
    
long  l,s[maxn];
}bign;

long  n,ans;
bign m;

bool  isOK(bign  & a)
{
    
long  i = 0 ,j = a.l - 1 ;
    
while (i <= j)
        
if (a.s[i] != a.s[j])
            
return   false ;
        
else {
            i
++ ;j -- ;
        }
    
return   true ;
}

int  main()
{
    
string  st;
    memset(
& m, 0 , sizeof (m));
    cin
>> n >> st;
    m.l
= st.length();
    
if (n != 16 )
        
for ( long  i = m.l - 1 ;i >= 0 ;i -- )
            m.s[i]
= st.at(m.l - i - 1 ) - ' 0 ' ;
    
else
        
for ( long  i = m.l - 1 ;i >= 0 ;i -- )
            
if (st.at(m.l - i - 1 ) >= ' A ' && st.at(m.l - i - 1 ) <= ' F ' )
                m.s[i]
= st.at(m.l - i - 1 ) - ' A ' + 10 ;
            
else   if (st.at(m.l - i - 1 ) >= ' a ' && st.at(m.l - i - 1 ) <= ' f ' )
                m.s[i]
= st.at(m.l - i - 1 ) - ' a ' + 10 ;
            
else  m.s[i] = st.at(m.l - i - 1 ) - ' 0 ' ;
    
while ( ! isOK(m) && ans <= 30 )
    {
        bign t;
        memcpy(
& t, & m, sizeof (t));
        memset(
& m, 0 , sizeof (m));
        m.l
= t.l;
        
for ( long  i = 0 ;i <= t.l - 1 ;i ++ )
        {
            m.s[i]
+= t.s[i] + t.s[t.l - i - 1 ];
            
if (m.s[i] >= n)
            {
                m.s[i
+ 1 ] ++ ;
                m.s[i]
-= n;
            }
        }
        
if (m.s[m.l]) m.l ++ ;
        ans
++ ;
    }
    
if (ans <= 30 )
        cout
<< ans << endl;
    
else  cout << " Impossible " << endl;
return   0 ;
}


你可能感兴趣的:(rqnoj 148 回文数)