hdu 1239 Calling Extraterrestrial Intelligence Again(数学题)

题意及解题思路:

       输入m,a,b;输出c,d

       满足条件:

         1.找出两个质数c,d。(大素数表)

         2.满足c*d为不大于m的最大值,(循环判断)

         先找最大的d,然后循环找出(m/d条件下)最大的c,

         还得在用一次d*c最大的条件,退出循环条件为找到的c》d;

         3.并满足 d>=c&&a*d<=b*c(判断条件)

#include<stdio.h>
#include<math.h>
const int M=150000;
int a[M];
int isprime()
{

    for(int i=0;i<M;i++)
    a[i]=i;
    a[1]=0;
    for(int i=2;i<sqrt((double)M);i++)
    {
        if(a[i]!=0)
        for(int j=2;i*j<M;j++)
        a[i*j]=0;
    }
    return 0;
}
int main()
{
    int m,ai,b;
    int t,c,d,e,max;
    isprime();
    while(scanf("%d %d %d",&m,&ai,&b)!=EOF&&m!=0&&ai!=0&&b!=0)
    {
        c=0;
        max=0;
        for(int i=m;i>=1;i--)
        {

            if(a[i]!=0)
            {
                //printf("%d**\n",a[i]);
                d=a[i];
                for(int j=m/d;j>=1;j--)
                if(a[j]!=0)
                {
                    //printf("%d\n",a[j]);
                    t=a[j];
                    if(b*t>=ai*d&&t<=d)
                    {
                        if(d*t>e*c)
                        {
                            e=d;
                            c=a[j];
                        }
                        break;
                    }

                }
            }
            if(t<=d)continue;
            if(c!=0)break;
        }
        printf("%d %d\n",c,e);
    }
    return 0;
}

 

 

 

你可能感兴趣的:(REST)