{
if (IntList[p-1]==0) continue;
int j=p*p;
while (j<=n)
{
if (IntList[j-1]!=0 )
{
IntList[j-1]=0;
len=len-1;
}
j=j+p;
}
}
PrimeList=new int[len];
int i=0;
for (int p=2;p<=n;p++)
{
if (IntList[p-1]!=0)
{
PrimeList[i]=IntList[p-1];
i=i+1;
}
}
}
}
这个算法思想和前面的算法完全一样,不过改正了上面算法中不完善的一些内容。
为了说明这两个算法的效率区别,我们编制了如下的主程序来比较一下他们的差异:
static void Main()
{
Console.WriteLine("Start!");
DateTime mytime5=DateTime.Now;
primegood.FindPrime(100000);
/*for (int i=0;i<=primegood.PrimeList.Length-1;i++)
{
Console.WriteLine(primegood.PrimeList[i]);
}*/
DateTime mytime6=DateTime.Now;
TimeSpan timeadd3=mytime6-mytime5;
Console.WriteLine(timeadd3.Ticks);
DateTime mytime1=DateTime.Now;
prime.FindPrime(100000);
DateTime mytime2=DateTime.Now;
TimeSpan timeadd=mytime2-mytime1;
DateTime mytime3=DateTime.Now;
primegood.FindPrime(100000);
DateTime mytime4=DateTime.Now;
TimeSpan timeadd2=mytime4-mytime3;
Console.WriteLine(timeadd.Ticks);
Console.WriteLine(timeadd2.Ticks);
}
}
通过运行这个程序,可以发现他们的差别是如此的大(前面的算法所耗时间几乎是后面算法的30-60倍),参见下图:
事实上,这两个算法的时间复杂度近似为:⊙(n1.5);⊙(n);可见,对于同一个问题有着多种不同复杂性的算法实现,算法设计是一门十分重要的学问。