hdu 1239 水题

View Code
//hdu 1239  水题


//题目从In other words开始看就可以了
//题目给出三个整数 m a b, 0 < a/b < 1
//要求出两个素数 p, q
//使得 p*q <= m 并且 a/b <= p/q <= 1
//要求输出满足条件的 p和 q中 p*q 最大的一对
//我是先打素数表再,暴力过了的


#include <stdio.h>
#include <string.h>

#define N 100005

int m, a, b;
bool no_prime[N];


void get_prime()    //素数打表
{           //317^2 刚好大于 100000
    for(int i = 3; i < 317; i += 2)
    {
        if(no_prime[i] == false)
        {
            int tmp = i << 1;
            for(int j = i * i; j < N; j += tmp)
                no_prime[j] = true; //不是素数的标为true
        }
    }
}

int main()
{
    get_prime();
    while(scanf("%d%d%d", &m, &a, &b), m || a || b)
    {
        bool flag = false;
        double limit = a * 1.0 / b;

        int p = 0, q = 0;
        for(int i = 2; i <= m; ++i) //1 不是素数
        {
            if(no_prime[i] != true && i%2 != 0 || i == 2)
            {
                for(int j = 2; j <= i && i*j <= m; ++j)
                {
                    if((no_prime[j] != true && j%2 != 0 || j == 2))
                    {   //题目要求答案为 满足条件的 p和 q中 p*q 最大的一对
                        if(j*1.0 / i >= limit && i*j > p*q)
                        {
                            p = j;
                            q = i;
                        }
                    }
                }
            }
        }
        printf("%d %d\n", p, q);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gabo/p/2444038.html