杭电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;
}

转载于:https://www.cnblogs.com/north_dragon/archive/2010/04/25/1720684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值