LeeBlog

导航

HDU 2089 不要62

  这题开始采用直接计算的方法,后来发现直接计算果断超时,最后选择打表

#include <stdio.h>
int lucky[1000024];
void luck ( )//打表,否则超时 
{
     int i,f;
     for ( i = 1 ; i < 1000024 ; ++i )
     {
         f = 1;//f为标记 
         int d[ 20 ];
         for ( int j = i,k = 0 ; j ; ++k  )//对每一个数进行判断 
         {
             d[ k ] = j % 10 ;
             j = j / 10;
             if ( d[ k ] == 4 )
                f = 0 ;
             if ( k && ( d[ k ] == 6 ) && ( d[ k - 1 ] == 2 ) ) 
                f = 0;
         } 
         if ( f )
            lucky[ i ] = 1;
         else
             lucky[ i ] = 0;
     } 
 }
int cal ( int n, int m )  //统计n到m内的lucky数 
{
     int sum = 0;
     for ( ; n <= m; ++n )
         if ( lucky[ n ] )
            ++sum;
     return sum;
 }
int main ( )
{
    luck(  );
    int n,m;
    while ( scanf ( "%d%d",&n,&m ) == 2 )
    {
          if ( n == 0 && m == 0 )
             break;
          if ( n > m )//确保m大于n 
          {
               n = n ^ m;
               m = n ^ m;
               n = n ^ m;
           }
           printf ( "%d\n",cal ( n,m ) );
          }
    return 0;
}

posted on 2011-01-31 17:11  LeeBlog  阅读(333)  评论(0编辑  收藏  举报