hdu1043-素数回文

2014-11-23 23:24:29 · 作者: · 浏览: 4

整体思想可以理解为打表,可以通过如下办法打表(但是相对比较麻烦),还可以直接使用数组,将所有数据直接存储进来,这种方法相对比较简单,可以不需要使用高效的素数法;

#include   
#include   
#include   
#include   
#include   
  
using namespace std;  
bool prime[9989900] ;   
int re_prime[ 1000 ] ;  
void Prime( )//高效判断素数法:所有和数都等于N个素数的乘积   
{  
    int i , j ;  
   /* for( i = 5 ; i <= 10000 ; ++i ) 
        prime[ i ] = 0 ;*/  
    i = 2 ;  
    for( j = i * i ; j < 9989900 ; j += i )  
        prime[ j ] = true ;  
    for( i = 3 ; i < 10000 ; i += 2  )  
    {  
        if( prime[ i ] )  
            continue ;  
        for( j = i * i ; j < 9989900 ; j += i )  
            prime[ j ] = true ;  
    }  
}     
  
bool test( int temp )  
{  
    int a = temp ;  
    int b = 0 ;  
    while( temp )  
    {  
        b = b * 10 ;  
        b += temp % 10 ;  
        temp /= 10 ;  
    }  
    return a == b ;  
}   
  
int main()  
{  
    int a , b , k = 0 , i , j;  
    Prime();  
    for( i = 5 ; i < 9989900 ; i += 2 )  
        if( !prime[ i ] && test( i ) )  
            re_prime[ k++ ] = i ;  
    while( scanf( "%d%d" , &a , &b ) != EOF )  
    {  
            for( i = 0 ; i < k ; ++i )  
            {  
                if( re_prime[ i ] < a )  
                    continue ;  
                else if( re_prime[ i ] <= b )  
                    printf( "%d\n" ,re_prime[ i ] ) ;  
                else  
                    break ;  
            }  
            printf( "\n" ) ;  
    }  
}  

#include
#include
#include
#include
#include

using namespace std;
bool prime[9989900] ; 
int re_prime[ 1000 ] ;
void Prime( )//高效判断素数法:所有和数都等于N个素数的乘积
{
    int i , j ;
   /* for( i = 5 ; i <= 10000 ; ++i )
    	prime[ i ] = 0 ;*/
    i = 2 ;
    for( j = i * i ; j < 9989900 ; j += i )
    	prime[ j ] = true ;
    for( i = 3 ; i < 10000 ; i += 2  )
    {
		if( prime[ i ] )
			continue ;
		for( j = i * i ; j < 9989900 ; j += i )
			prime[ j ] = true ;
	}
}   

bool test( int temp )
{
	int a = temp ;
	int b = 0 ;
	while( temp )
	{
		b = b * 10 ;
		b += temp % 10 ;
		temp /= 10 ;
	}
	return a == b ;
} 

int main()
{
	int a , b , k = 0 , i , j;
	Prime();
	for( i = 5 ; i < 9989900 ; i += 2 )
		if( !prime[ i ] && test( i ) )
			re_prime[ k++ ] = i ;
	while( scanf( "%d%d" , &a , &b ) != EOF )
	{
			for( i = 0 ; i < k ; ++i )
			{
				if( re_prime[ i ] < a )
					continue ;
				else if( re_prime[ i ] <= b )
					printf( "%d\n" ,re_prime[ i ] ) ;
				else
					break ;
			}
			printf( "\n" ) ;
	}
}