杭电1239题

//数值型搜索题 关键点:缩小素数的范围
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int prime[10000];
int num = 0;
void generate_prime()
{
 for(int i=2;i<10000;++i)
 {
  bool isPrime = true;
  for(int i1=2;i1<=sqrt(double(i));++i1) //(1)此处注意是<=sqrt(i),例如当i=4的情况(2)sqrt调用时一定要注意加double,否则会出现编译错误(因为math.h中重载了sqrt函数)
  {
   if(i % i1==0)
   {
    isPrime = false;
    break;
   }    
  }
  if(isPrime)
  {
   prime[num] = i;
   num++;
  }
 }
}
int main()
{
 int m,a,b;
 //生成1-10000之间的素数
 generate_prime();
 //freopen("1.txt","r",stdin);
 while(cin>>m>>a>>b && !(m==0 && a==0 && b==0))
 {
  int mul=1;
  int p,q;
  for(int i2=num-1;i2>-1;--i2)  //q  
  {
   for(int i3=i2;i3>-1;--i3) //p
   {
    if(prime[i2]*prime[i3]<=m && (double)prime[i3]/prime[i2]>=(double)a/b) //整数相除一定要注意加double,特别注意结果小于1的时候
    {
     //cout<<prime[i3]<<" "<<prime[i2]<<endl;  //有可能中间的两个数的乘积最大
     if(mul < prime[i2]*prime[i3])
     {
      mul = prime[i2]*prime[i3];
      p = prime[i3];
      q = prime[i2];
      break;
     }     
    }
   }
  }
  cout<<p<<" "<<q<<endl;
 }
 //fclose(stdin);
 return 0;
}

你可能感兴趣的:(杭电)