- 请在指定位置编写程序,完成函数,实现上述Eratosthenes筛子算法。
提示:用list来存放最初的数列,以及最终的结果。
回忆一下问题求解的步骤,最后一步“回头看”还没有做。具体到筛选素数的问题,可以问很多“回头看”的问题:结果对吗?为什么?问题求解的效率还能提高吗?
通过观察,可以发现每次从序列中划去的整数满足两个条件: 那么,a或b或二者都必须小于\sqrt[2]{n}2√n。所以,当序列的第一个数大于等于\sqrt[2]{n}2√n时,就可以结束循环了。 2. 基于上述观察得到的线索,请优化Eratosthenes筛子算法,并在指定位置编写程序,完成函数,实现优化后的算法。
提示:用list来存放最初的数列,以及最终的结果。 这种改进是否能改善了效率呢?可以在代码中插入一些“探针”,来统计循环次数,或利用python的time库,计算循环前后的时间。如下面代码所示: - from time import clock
- count = 0
- start = clock()
- sum = 0.0
- for i in range(100):
- sum += i
- count += 1
- end = clock()
- print(count, end-start)
这段代码中的变量count用来统计循环的执行次数,for循环前后的代码分别获得开始执行的时刻和执行完毕的时刻,两个时刻的差就是运行时间。 3. 请利用上述方法,重新编写第一题和第二题的函数,插入统计循环次数的代码,在函数中循环执行完后,输出循环次数。(只统计外层循环的执行次数)
|