1.设计一个时间复杂度低于O(n^2)的算法,计算n以内的质数表,并且计算你的算法的复杂度.
注:本文最初发表于汕头大学郁金香bbs.
发信人: guomin (CS03.working for tomorrow), 信区: Program
标 题: Re: 算法考试样题
发信站: 郁金香BBS站 (2006年01月12日15:46:20 星期四), 站内信件
考完试,无聊..练习打字.
第一题我的解法,不知道对错,错了麻烦大家提出来^_^;我考虑尽量做到最优.
(1)建立一个可变长度的数组P[i](为叙述方便)用来保存质数表;
(2)程序:
if(n<=1) exit(0); //如果n<=1,退出程序
else if(n>=2) P[0]=2; //如果n>=2,将2添加进质数表
else if(n<3) 打印质数表; //如果n==2,实际上只有一个质数:2,输出质数表
else { //如果n>=3
P[1]=3; //将3添加进质数表
for(int k=5;k<=n;) //从5开始验证,如果n=3或者4,不进入循环
{
limit=sqrt(k)+1; //素数验证上界,只需要整除到根号n就可以了
for(int j=1;j<i;j++) //从质数表中整除,如果n整除尽前面所有的质数还不能整除,则添加进质数表
{ //j=1开始,因为没有偶数,不用考虑第一个P[0]=2
if(k%P[j]==0) goto onto; //如果能整除小于k的质数表里面的质数之一,就转到onto处理
}
P[i+1]=k; //整除不了,添加进质数表
onto:k+=2; //因为奇数才需要验证,偶数不用考虑(除2外)
if(k%3==0) k+=2; //能被3整除的不用考虑
}
}
(3)打印质数表P[i]
※ 来源:·郁金香BBS站 bbs.stu.edu.cn·[FROM: 郁金香BBS站]