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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值