给定整数m,a,b(4 < m <= 100000 and 1 <= a <= b <= 1000)
需要找到两个数(不妨设为p,q)满足以下条件:
p,q均为质数;
p*q<=m;
a/b <= p/q <= 1;
输出所有满足以上条件的p,q中乘积最大的一对p,q;
分析:
p,q的范围其实可在2—50000(why?)
(事实上,很多通过的程序就采取的事这种思路,然而这是最小的范围吗?)
考虑9091这个数
2/9091=0.00022
3/9091=0.00033
5/9091=0.00055
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<map>
#include<iostream>
#include<math.h>
#include <queue>
#include<algorithm>
using namespace std;
#define inf 2147483646
#define pi 3.1415926535898
#define N 33
#define LL __int64
int main()
{
int m,a,b;
int prime[2001],i,j,num=0,n;
for(i=2;i<9091;i++)
{
n=0;
for(j=2;j*j<=i;j++)
{
if(i%j==0)
{
n=1;
break;
}
}
if(!n)
prime[num++]=i;
}
while(scanf("%d%d%d",&m,&a,&b)&&(a+b+m))
{
int max=0,p,q;
double k=(double)a/b;
for(i=num-1;i>=0;i--)
{
if(prime[i]>m) continue;
for(j=i;j<=num-1;j++)
{
if(prime[j]>m||prime[i]*prime[j]>m||((double)prime[i]/prime[j])<k)
break;
if(prime[i]*prime[j]>max)
{
max=prime[i]*prime[j];
p=prime[i];q=prime[j];
}
}
}
printf("%d %d\n",p,q);
}
}
7/9091=0.00077
而考虑到a,b的取值范围(1<=a<=b<=1000)
可知min(a/b)=0.001
所以2,3,5,7均不能作为p.
min(p)=11;
而11*9091=100001>100000;
所以无论如何9091都不能作为q
而超过9091的数则更不可能。
所以p,q只能在2—9091中取值,从而使问题大大简化