hdu2303_The Embarrassed Cryptographer

hdu2303_The Embarrassed Cryptographer

        好几天都没有刷题了,心里好烦躁啊!

        今天终于又做了一个不是很水的题目,数论的,大整数取余,直接暴力过了。其中又学了一种素数的筛选法,效率比我以前用的方法都要高。他不计算,只是筛选。这样一来效率就高了很多。还有一个地方,就是大整数的取余,从高位,到低位,边乘边取余,根据的是同余定理。


#include  < stdio.h >
#include 
< string .h >
#include 
< stdlib.h >

int  p[ 1000000 ] ;
char  pr[ 1000000 ] ;
int  len, pnum, num[ 14 ] ;

void  prime( )
{
    
int i, j ;
    
// 筛选素数 
    for( i=2; i<1000000++i ){
        pr[i] 
= 1 ;
    }

    
for( i=2,pnum=0; i<1000000++i ){
        
if( pr[i] ){
            p[pnum
++= i ;
            
for( j=i+i; j<1000000; j+=i )
                pr[j] 
= 0 ;
        }

    }

}


int  mod(  int  n )
{
    __int64 m
=0 ;
    
int i ;
    
// 求余数 
    for( i=len-1; i>=0--i ){
        m 
= ( m*100000000+num[i] ) % n ;
    }

    
return m ;
}


int  main()
{
    
char a[111] ;
    
int i, j, div, flag ;
    
    prime( ) ;
    
    
while( scanf("%s%d", a, &div ) && div && a[0]!='0' ){
        len 
= strlen( a ) ;
        
for( i=0; i<14++i )
            num[i] 
= 0 ;
        
for( i=0; i<len; ++i ){
            
//逢一亿进位 
            j = (len+7-i) / 8 - 1 ;
            num[j] 
= num[j]*10 + a[i]-'0' ;
        }

        len 
= (len+7)/8 ;
        flag 
= 1 ;
        
for( i=0; p[i]<div && i<pnum; ++i ){
            
if( mod( p[i] ) == 0 ){
                flag 
= 0 ;
                
break ;
            }

        }

        
if( flag )
            printf(
"GOOD\n") ;
        
else
            printf(
"BAD %d\n", p[i] ) ;
    }

    system(
"pause");
    
return 0 ;
}

你可能感兴趣的:(hdu2303_The Embarrassed Cryptographer)