ZOJ Problem 1689 Calling Extraterrestrial Intelligence Again

/*

   2006 12 4

   p,q的取值不可能超过10000

   先由筛法得到10000以内的所有素数,再根据素数的个数得到存放了素数的ip数组。

   搜索时注意减少循环次数。

*/

#include <stdio.h>

 

const int NUM=10001;

int a[10001];

 

int main(){

   int i,j,count=0;

   for(i=2;i<NUM;i++)  a[i]=1;

   for(i=2;i*i<NUM;i++)

      if(a[i])

        for(j=i*i;j<NUM;j+=i)

           a[j]=0;

   for(i=2;i<NUM;i++)

      if(a[i]) count++;

   int* ip=(int*)malloc(count*sizeof(int));

   for(i=2,j=0;i<NUM;i++)

      if(a[i]) ip[j++]=i;

 

   int m,a,b,p,q,rp,rq,max; /*rp,rq存放的是乘积最大的两个素数的下标*/

   double ratio;

   while(scanf("%d%d%d",&m,&a,&b)!=EOF){

      if(m==0 && a==0 && b==0) break;

      ratio=(double)a/b;

      max=0;

      for(p=count-1;p>=0;p--){

        for(q=p;q<=count-1;q++){

           if(ip[q]>m || ip[p]*ip[q]>m || ((double)ip[p]/ip[q])<ratio)

              break;  /*此处的判断可大大减少循环的次数*/

           if(ip[p]*ip[q]>max){

              max=ip[p]*ip[q];

              rp=p,rq=q;

           }

        }

      }

      printf("%d %d/n",ip[rp],ip[rq]);

   }

   free(ip);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值