注解
1、首先用筛法求100000以内的素数,并找到其个数。
2、在所有找到的素数中,遍历找一个素数对,满足:
(1)二者相乘小于等于m;
(2)二者相乘是所有满足条件的素数对中的最大的;
(3)二者相除大于等于a/b,并且小于等于1
代码
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100000;
const int len = 9593;
int prime[len];
void sieve() {
int a[maxn];
int k=0;
memset(a, 0, sizeof(a));
for(int i=2; i<maxn; i++) {
if(!a[i]) {
prime[k++] = i;
for(int j=i+i; j<maxn; j+=i) {
a[j] = 1;
}
}
}
}
int main() {
sieve();
int m, a, b;
cin>>m>>a>>b;
while(m || a || b) {
int maxnow = -1;
int ansa = -1;
int ansb = -1;
for(int i=0; i<len; i++) {
if(prime[i]>m) {
break;
}
for(int j=i; j<len; j++) {
if(prime[j]>m) {
break;
}
if(prime[i]*prime[j]<=m && prime[i]*prime[j]>maxnow && (double)prime[i]/prime[j]>=(double)a/b) {
maxnow = prime[i]*prime[j];
ansa = prime[i];
ansb = prime[j];
}
}
}
cout<<ansa<<" "<<ansb<<endl;
cin>>m>>a>>b;
}
return 0;
}
结果
来源:https://blog.csdn.net/zhanggirlzhangboy/article/details/100085511