有两个典型算法,思路都很清晰.
其一: 凡是只能被1和自己整除的就是质数
其二: 凡是最少有两个因数的就不是质数
就这么两个例子,逻辑上都没有错误,但是分别执行一下,记录并比较一下耗时,就会有惊人的发现。
算到九千以内的时候,算法一基本上还能工作,但是耗时为3秒;而这个时候算法二只需要30毫秒。
这就是差距了,哈哈~~~
话题外再说一句,算法二的一个关键点,就是实际工作中可能需要以适当的空间开销来换取工作效率的提高。
附上用js实现的两个算法程序。
其一: 凡是只能被1和自己整除的就是质数
var stopwatch = new Date();
var PrimeArys = [2];
var count = 1;
var isss = 0;
var MaxNum = 9000;
for(var i=3 ;i<=MaxNum;i+=2)
{
for(var j=3;j<(i/2);j+=2)
{
if(i%j==0){
isss = 1;
break;
}else{
isss = 0;
}
}
if(isss == 0){
{
PrimeArys[ count++ ] = i;
}
}
}
var t=new Date()-stopwatch;
alert("本次运行了 "+t+" 毫秒。");
document.write( PrimeArys.join(" ") , "
从2到"+MaxNum+"共有素数 "+count+" 个。");
var PrimeArys = [2];
var count = 1;
var isss = 0;
var MaxNum = 9000;
for(var i=3 ;i<=MaxNum;i+=2)
{
for(var j=3;j<(i/2);j+=2)
{
if(i%j==0){
isss = 1;
break;
}else{
isss = 0;
}
}
if(isss == 0){
{
PrimeArys[ count++ ] = i;
}
}
}
var t=new Date()-stopwatch;
alert("本次运行了 "+t+" 毫秒。");
document.write( PrimeArys.join(" ") , "
从2到"+MaxNum+"共有素数 "+count+" 个。");
其二: 凡是最少有两个因数的就不是质数
var stopwatch = new Date();
var MaxNum = 9000;
var i, j;
var count = 1;
var PrimeTemp = [];
var PrimeArys = [2];
var oNum = Math.ceil( Math.sqrt( MaxNum ) );
for(i=3; i<oNum; i+=2)
if( PrimeTemp[i]==null )
for(j=i; i*j<=MaxNum; j+=1)
PrimeTemp[ i*j ] = 0;
for(i=3; i<=MaxNum; i+=2)
if( PrimeTemp[i]==null )
PrimeArys[ count++ ] = i;
var t=new Date()-stopwatch;
alert("本次运行了 "+t+" 毫秒。");
document.write( PrimeArys.join(" ") , "
从2到"+MaxNum+"共有素数 "+count+" 个。");
var MaxNum = 9000;
var i, j;
var count = 1;
var PrimeTemp = [];
var PrimeArys = [2];
var oNum = Math.ceil( Math.sqrt( MaxNum ) );
for(i=3; i<oNum; i+=2)
if( PrimeTemp[i]==null )
for(j=i; i*j<=MaxNum; j+=1)
PrimeTemp[ i*j ] = 0;
for(i=3; i<=MaxNum; i+=2)
if( PrimeTemp[i]==null )
PrimeArys[ count++ ] = i;
var t=new Date()-stopwatch;
alert("本次运行了 "+t+" 毫秒。");
document.write( PrimeArys.join(" ") , "
从2到"+MaxNum+"共有素数 "+count+" 个。");