POJ1411

打表求出100000以內的所有素數,再枚舉就是了

 

#include <iostream>
#include <cmath>
#include <set>
using namespace std;


bool checkPrime(int value)
{
    int max_value = sqrt(value);
    for(int i=2; i<=max_value; i++)
    {
        if( value % i == 0 )
        {
            return false;
        }        
    }

    return true;
}

int main()
{
    int m, a, b;
    set<int> prime_set;
    for(int i=2; i<=100000; i++)
    {
        if( checkPrime(i) )
        {
            prime_set.insert(i);
        }
    }    
        
    while( cin >> m >> a >> b )
    {
        if( m == 0 ){
            break;
        }
        
        int p_max = int(sqrt(m));
        set<int>::iterator p_end_iter = prime_set.begin();
        for(; p_end_iter!=prime_set.end(); p_end_iter++)
        {
            if(*p_end_iter>p_max)
            {
                break;
            }
        }    
            
        double min_value = double(a)/b;
        int max_value = 0;
        int s_p, s_q;
        for(set<int>::iterator p_iter=prime_set.begin(); (*p_iter)!=(*p_end_iter); p_iter++)
        {
            for(set<int>::iterator q_iter=prime_set.begin(); q_iter!=prime_set.end(); q_iter++)
            {
                if( *q_iter < *p_iter )
                {
                    continue;
                }    
                if( (*p_iter) * (*q_iter) > m )
                {
                    break;        
                }
                    
                if( double(*p_iter)/(*q_iter)+ 0.0000001 < min_value )
                {
                    break;    
                }    
                
                if( (*p_iter) * (*q_iter) > max_value ){
                    max_value = (*p_iter) * (*q_iter);
                    s_p = *p_iter;
                    s_q = *q_iter;
                }
            }
        }            

        cout << s_p << " " << s_q << endl;
    }
    
    return 0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章