判断一个数是否质数,可以这样用埃氏筛法吗?还可以怎样优化?
bool isprime(int x)
{
int a=ceil(sqrt(x));
int i=2;
bool isp;
for(;i<=a;i++)
{
isp=true;
for(int j=2;j<ceil(i/2);j++)
{
if(i%j==0)
isp=false;
}
if(isp)
if(x%i==0)
return false;
}
return true;
}
呃,程序跑着没问题,不过我个人觉得不能算是埃氏筛法,可能是你在第十行那个循环那想先筛去一部分,可是第十行那个循环本身有问题,程序跑出来结果对还是靠后面那个循环,比如以100为例,第十行“筛选”后交给下面循环如图,根本就是完全靠if(isp)在计算,而且计算量远大于一般算法,埃氏算法就在csdn能找到,我就不发了,在循环计算前把它筛去,不让他参加计算,这才是这个算法优化的地方。你的代码用第十行循环和不用的运行时间如下(以1000为例)
bool isprime(int x)
{
int a,i;
bool isp;
a=ceil(sqrt(x));
i=2;
for(;i<=a;i++)
{
if(i<=10)
{
isp=true;
for(int j=2;j<ceil(i/2);j++)
{
if(i%j==0)
isp=false;
}
}
else
{
isp=isprime(i);
}
if(isp)
if(x%i==0)
return false;
}
return true;
}
改进了一下,这样快了很多,这样行吗