题意及解题思路:
输入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; }