poj1411有关+用筛法 TLE了普通方法AC了+有时间问问

来源:互联网 发布:linux防御xorddos 编辑:程序博客网 时间:2024/06/11 10:04
#include<stdio.h>#include<stdlib.h>#include<iostream>#include<math.h>#define N 50001using namespace std;bool prime[N];int main(){    int i, j;    for (i = 2; i<N; i++)//先把偶数给删了    {        if (i % 2 == 0 && i != 2)prime[i] = false;        else prime[i] = true;    }    for (i = 3; i <= sqrt((double)N); i += 2)//筛法核心:就是当i是质(素)数的时候,i的所有的倍数必然是合数。    {        if (prime[i])            for (j = i + i; j<N; j += i)                prime[j] = false;    }  /*  for(i=2;i<100;i++)    {        if(prime[i])            printf("%d\n",i);    }    */    int m=0, a=0, b=0, maxn=0, p=0, q=0,p1,q1;    double temp;    while (scanf("%d%d%d", &m, &a, &b))    {        if (m == 0 && a == 0 && b == 0)            break;        maxn = 0;        temp=(double)a/b;                for (p = 2; p*p <= m; p++)        {            if(prime[p])            {                for (q = 2;p*q <= m; q++)                {                    if (prime[q]&&temp<=(double)a/b&&(double)p / q <= 1.0)                    {                        if (p*q > maxn)                        {                            maxn = p*q;                            p1 = p;                            q1 = q;                        }                    }                }            }        }        printf("%d %d\n", p1, q1);    }    return 0;}

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>using namespace std;bool IsPrime(int n){int m = sqrt(n*1.0);for(int i=2;i<=m;i++){if(n%i==0)return false;}return true;}int main(){int m,a,b;while(scanf("%d%d%d",&m,&a,&b)){if(m==0&&a==0&&b==0)break;int bounds = sqrt(m*1.0);int max = 0;int p,q;for(int i=2;i<=bounds;i++)//判断是否是质数{if(!IsPrime(i))continue;int e = (i*b)/a;//e肯定比i大int min = m/i;if(e>min)e = min;//两者取最小for(int j=e;j>=i;j--){if(IsPrime(j)){if(i*j>max){max = i*j;p=i;q=j;}break;}}}cout<<p<<" "<<q<<endl;}return 0;}

0 0