题意: 两个素数 p, q 并且 pq <= m and a / b <= p / q <= 1,4 < m <= 100000 and 1 <= a <= b <= 1000.求最大的q,p值
思路:暴力求解
因为 0.001<=a/b <= 1000 ,4 < m <= 100000 qp = m,
假设 p/q = 0.001,q*p = m = 100000,解得q<=p <= 10000;
说明q,p素数都不超过10000,打素数表,两个循环暴力,因为p/q不超过1,所以从p/q = 1 开始向下暴力
注意剪枝,当q*p > m ,a/b > p/q ,p/q > 1 都不往下搜。再用一个保存搜到的最大值
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int p[15000] = {0};//素数表,只是标记1--x的数中那些不是素数
int prim[1500] = {0};//保存的素数表
int prime(int x)//筛法打表,并返回素数1————x的素数个数
{
int i,j;p[1] = 1;
for(i = 2; i <= sqrt(x); i++)
{
for(j = i+1; j <= x; j++ )
{
if(j % i == 0 )
{
p[j] = 1;
}
}
}
int k = 1;
for(i = 1; i <= 10000;i++)
{
if(!p[i])
{
prim[k++] = i;
}
}
return k;
}
int main()
{
int len = prime(10000);
int mm,a,b;
while( scanf("%d%d%d",&mm,&a,&b) )
{
if(mm == 0 && a == 0 && b == 0 )
{
break;
}
int i,j = 1;
int c,d,sum = 0;
for(i = len-1; i >= 1 ; i--)
{
for(j = i;j <= len-1; j++)//从1开始往下搜索
{
if(prim[i]*prim[j] > mm || a*1.0/b > prim[i]*1.0/prim[j] || i*1.0/j > 1)
{
break;
}
else
{
if(sum < prim[i]*prim[j])
{
sum = prim[i]*prim[j];
c = prim[i];d = prim[j];
}
}
}
}
printf("%d %d\n",c,d);
}
return 0;
}