题目链接:http://poj.org/problem?id=1411
本来是自己写的,但是一直超时,一时也想不到好的剪枝方法,就去网上找了找,主要内容转载自一下链接:
http://blog.sina.com.cn/s/blog_6a98ae6c0100les3.html
分析:
1.读题,看懂题意。
2.分析题意,把问题抽象化。
3.获取有用信息
c.输出所有满足以上条件的p,q中乘积最大的一对p,q
思路分析:
1.典型的搜索
2.p,q的要求
3.按上述思想流程应为
4.面临的问题:
5.深入分析
考虑9091这个数
而超过9091的数则更不可能。
所以p,q只能在2—9091中取值,从而使问题大大简化。
代码:
#include<stdio.h>
int prime1[10000]={0};
int prime[20000];
int count,max;
int m,a,b;
int ans1,ans2;
void getprime()
{
int i,j;
prime1[0]=1;
prime1[1]=1;
for(i=2;i<=5000;i++)
{
if(!prime1[i])
{
for(j=2;i*j<=10000;j++)
{
prime1[i*j] = 1;
}
}
}
count=-1;
for(i=0;i<10000;i++)
if(prime1[i] == 0)
{
++count;
prime[count]=i;
}
}
int main()
{
int i,j;
getprime();
while(1)
{
scanf("%d%d%d",&m,&a,&b);
if(m==0 && a==0 && b==0)
break;
max=0;
for(i=count;i>=0;i--)
{
if(prime[i]>m)continue;
for(j=i;j<=count;j++)
{
if(prime[j]>m || prime[i]*prime[j]>m || (double)prime[i]/prime[j] < (double)a/b)break;
if(prime[i]*prime[j] > max)
{
max=prime[i]*prime[j];
ans1=prime[i];
ans2=prime[j];
}
}
}
printf("%d %d\n",ans1,ans2);
}
return 0;
}