题目大意:
a.给定整数m,a,b(4 < m <= 100000 and
1 <= a <= b <= 1000)
b.需要找到两个数(不妨设为p,q)满足以下条件:
p,q均为质数;
p*q<=m;
a/b <= p/q <= 1;
c.输出所有满足以上条件的p,q中乘积最大的一对p,q
实现代码1(本人的):
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{//判断是否是素数,是的话返回1,否则返回0
int temp,i;
if(n<1)
return 0;
if(n==2)
return 1;
temp=1;
for(i=2;i<n;i++)
{
if(n%i==0)
{
temp=0;
break;
}
}
return temp;
}
int main()
{
int m,a,b;
int i,j;
while(scanf("%d%d%d",&m,&a,&b)!=EOF&&m||a||b)
{
float x;
x=1.0*a/b;
for(i=m;i>=4;i--)//从m开始查找,
if(!is_prime(i))//满足条件的 p*q 不可能是素数,在这里要懂得剪枝!!!
{
for(j=2;j<=sqrt(i*1.0);j++)
{
if(i%j==0)
{
if(is_prime(j)&&is_prime(i/j)&&(j*1.0/(i/j)>=x)&&(j*1.0/(i/j)<=1))//满足题设条件
{
//printf("%d %d\n",j,i/j);
//break;
goto result;//直接执行result语句。以前一直对这个搞的不是太清楚!!!现在明白了
}
}
}
}
result:printf("%d %d\n",j,i/j);
}
return 0;
}
实现代码2:
#include<stdio.h>
#include<math.h>
int num=0;
int prime[10000];
int isprime()
{
int temp;
int i,j;
for(i=2;i<10000;++i)
{
temp=1;
for(j=2;j<=sqrt((double)i);++j)
{
if(i%j==0)
{
temp=0;
break;
}
}
if(temp==1)
{
prime[num]=i;
num++;
}
}
return 0;
}
int main()
{
int m,a,b;
int i,j;
int max;
int p,q;
isprime();
while(scanf("%d%d%d",&m,&a,&b)!=EOF&&a||b||m)
{
max=1;
for(i=num-1;i>=0;--i)
{
for(j=i;j>=0;--j)
{
if(prime[i]*prime[j]<=m&&(double)prime[j]/prime[i]>=(double)a/b)
{
if(max<prime[i]*prime[j])
{
max=prime[i]*prime[j];
p=prime[j];
q=prime[i];
break;
}
}
}
}
printf("%d %d\n",p,q);
}
return 0;
}
两种方法基本思想差不多。。。。。