打表求出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;