hdu1239(Calling Extraterrestrial Intelligence Again 暴力搜索)

来源:互联网 发布:成绩统计软件 编辑:程序博客网 时间:2024/05/22 01:27

题意: 两个素数 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;}