hdu1239

/*
分析:
    下面的摘是杭电课件里面的分析:
  摘:
    p,q的范围其实可在2—50000(why?)
然而,这是最小的范围吗?
考虑大于10000的某个质数,不妨设为Q,另一个质数为P,则:
1、如果P<10,P/Q<0.001
2、如果P>10,P*Q>100000
而考虑到a,b的取值范围(1<=a<=b<=1000)
可知min(a/b)=0.001
同时,要求: p*q<=m<=100000
所以无论如何质数都不能超过10000。(事实上,不会超过9091)


                                                2012-04-20
*/








#include"stdio.h"
#include"string.h"
#include"math.h"
int main()
{
	int prime[2000],k;
	int num[10001];
	int i,l;
	int temp;
	int m;
	double a,b;
	double limit;
	int w,h;
	double max;


	memset(num,0,sizeof(num));
	num[0]=num[1]=1;
	k=0;
	for(i=2;i<=10000;i++)
	{
		if(num[i]==0)
		{
			for(temp=2*i;temp<=10000;temp+=i)
				num[temp]=1;
			prime[k]=i;
			k++;
		}
	}


	while(scanf("%d%lf%lf",&m,&a,&b),m!=0||a!=0||b!=0)
	{
		limit=a/b;
		max=0;


		for(i=k-1;i>=0;i--)
		{
			for(l=i;l>=0;l--)
			{
				if(prime[i]>m||prime[l]>m||prime[i]*prime[l]>m)
					continue;
				if((double)prime[l]/prime[i]<limit)
					continue;
				if(prime[i]*prime[l]>max)
				{
					max=prime[i]*prime[l];
					w=prime[i];
					h=prime[l];
				}
			}
		}


		printf("%d %d\n",w>h?h:w,w>h?w:h);
	}
	return 0;
}


你可能感兴趣的:(hdu1239)