"""
题目:判断101-200之间有多少个素数,并输出所有素数。
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
""" import math def answer1():
"""
根据素数定义,一个一个判断
:return:
"""
print("输出一", end=":")
sumCount = 0
findTimes = 0
for i in range(101, 2000):
for j in range(2, i):
findTimes += 1
if i % j == 0:
break
else:
print(i, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer1() def answer2():
"""
上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,
那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,
因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
:return:
"""
print("输出二", end=":")
sumCount = 0
findTimes = 0
for i in range(101, 2000):
sqrtNum = int(math.sqrt(i))
for j in range(2, sqrtNum + 1):
findTimes += 1
if i % j == 0:
break
else:
print(i, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer2() def answer3():
"""
方法(2)应该是最常见的判断算法了,时间复杂度O(sqrt(n)),速度上比方法(1)的O(n)快得多。最近在网上偶然看到另一种更高效的方法,暂且称为方法(3)吧,
由于找不到原始的出处,这里就不贴出链接了,如果有原创者看到,烦请联系我,必定补上版权引用。下面讲一下这种更快速的判断方法;
首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;
证明:令x≥1,将大于等于5的自然数表示如下:
······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,
显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。
这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。
根据以上规律,判断质数可以6个为单元快进,即将方法(2)循环中i++步长加大为6,加快判断速度,代码如下: 高手无处不在啊 由上可得,只要从96开始,每6个计算一次
:return:
"""
print("输出三", end=":")
sumCount = 0
findTimes = 0
for i in range(102, 2000, 6):
for num in (i - 1, i + 1):
sqrtNum = int(math.sqrt(num))
for j in range(2, sqrtNum + 1):
findTimes += 1
if num % j == 0:
break
else:
print(num, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer3() def answer4():
"""
上面的方法,高手还可以改进
因为上述可得,6x-1和6x+1坑定不会被6x,6x+2,6x+3,6x+4整除,弱它是素数,那么它也是被6x-1或6x+1整除
所以上面方法,里面的判断也可以跨6来判断
:return:
"""
print("输出四", end=":")
sumCount = 0
findTimes = 0
for i in range(102, 2000, 6):
for num in (i - 1, i + 1):
sqrtNum = int(math.sqrt(num))
for j in range(5, sqrtNum + 1, 6):
findTimes += 1
if num % j == 0 or num % (j + 2) == 0:
break
else:
print(num, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer4() def answer5():
"""
排除偶数,数组统计
:return:
"""
print("输出五", end=":")
findTimes = 0
numList = []
for i in range(101, 2000, 2):
numList.append(str(i))
sqrtNum = int(math.sqrt(i))
for j in range(2, sqrtNum + 1):
findTimes += 1
if i % j == 0:
numList.pop()
break
print(",".join(numList), end=",")
print("共%d个" % len(numList), end=",")
print("共比较了%d次" % findTimes) answer5() class answer6:
"""
练习迭代器
""" def __init__(self):
"""
构造函数
"""
self.sumCount = 0
self.findTimes = 0
self.startNum = 102
self.endNum = 2000
print("输出六", end=":") def __iter__(self):
"""
迭代器
:return:
"""
return self def __next__(self):
"""
迭代器next
:return:
"""
if self.startNum > self.endNum:
raise StopIteration
for num in (self.startNum - 1, self.startNum + 1):
sqrtNum = int(math.sqrt(num))
for i in range(5, sqrtNum + 1, 6):
self.findTimes += 1
if num % i == 0 or num % (i + 2) == 0:
break
else:
print(num, end=",")
self.sumCount += 1
self.startNum += 6 answer = answer6()
for i in answer:
pass
print("共%d个" % answer.sumCount, end=",")
print("共比较了%d次" % answer.findTimes) def answer7():
"""
练习yield生成器,注意和answer6区域
"""
print("输出七", end=":")
startNum = 102
sumCount = 0
findTimes = 0
while startNum < 2000:
for num in (startNum - 1, startNum + 1):
sqrtNum = int(math.sqrt(num))
for i in range(5, sqrtNum + 1, 6):
findTimes += 1
if num % i == 0 or num % (i + 2) == 0:
break
else:
sumCount += 1
print(num, end=",")
yield num
startNum += 6
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) for i in answer7():
pass def answer8():
"""
练习数组生成器表达式
参考:http://blog.csdn.net/u014745194/article/details/70176117
:return:
"""
print("输出八", end=":")
numList = list(filter(lambda x: x not in set([i for i in range(101, 200) for j in range(2, i - 1) if not i % j]),
range(101, 200)))
print(numList, end=",")
print("共%d个" % len(numList)) answer8()

  

python学习——练习题(12)的更多相关文章

  1. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  2. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  3. Python学习(12)日期和时间

    目录 Python 日期和时间 时间元组 获取当前时间 获取格式化时间 格式化日历 获取某月日历 Time模块 日历模块 其他相关模块和函数 Python 日期和时间 Python 程序能用很多方式处 ...

  4. Python学习:12.Python字符串格式化

    字符串格式化 讲解Python这么久,也没有讲解Python的字符串的格式化,那我们今天就来了解一下python字符串格式化的强大之处. 首先我们先理解一下为什么要有字符串的格式化,就是为了方便字符串 ...

  5. python学习——练习题(4)

    """ 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from fu ...

  6. python 学习笔记12(事件驱动、IO多路复用、异步IO)

    阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...

  7. python学习(12)使用正则表达式

    1.正则表达式知识 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat / but / b#t / b1t等 \w 匹配字母/数字/下划线 b\wt 可以匹配bat / b1t / b_ ...

  8. Python学习总结12:sys模块

    sys模块常用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互. 1. 导入及函数查看 >>> import sys #导入sys模块 >>&g ...

  9. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

随机推荐

  1. 在notepad++中插件安装的办法

    在notepad++中插件安装的办法新版的notepad++去掉了一个叫做插件管理工具的插件.这就导致我们不能通过界面去安装notepad++的一些比较方便的插件了.本文通过手动安装插件管理工具和ft ...

  2. 一个关于PCA的疑问

    我们知道PCA干的事情是把n维的样本投影到k维,同时丢失的信息能够达到最少. 为什么说principal component是covariance matrix的特征值中最大的前k个对应的特征向量上的 ...

  3. softmax与logistic关系

    Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签  可以取两个以上的值. Softmax回归模型对于诸如MNIST手写数字分类等问题是很有用的,该问 ...

  4. LOJ2421 NOIP2015 信息传递 【tarjan求最小环】

    LOJ2421 NOIP2015 信息传递 LINK 题目大意就是给你一个有向图,求最小环 有一个很奇妙的性质叫做每个点只有一条出边 然后我们考虑对每个强联通分量进行考虑 发现每个强联通分量内的边数一 ...

  5. Redis缓存的设计、性能、应用与数据集群同步

    Redis缓存的设计.性能.应用与数据集群同步 http://youzhixueyuan.com/design-performance-and-application-of-redis-cache.h ...

  6. LeetCode 819. Most Common Word

    原题链接在这里:https://leetcode.com/problems/most-common-word/description/ 题目: Given a paragraph and a list ...

  7. lua resty template && openresty 使用

    1. 安装 luarocks install lua-resty-template 2. 使用   配置模板页面位置     有多种方式:   a.  直接使用root 目录     代码如下:    ...

  8. Hibernate One-to-One Mappings 一对一关系映射

    Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...

  9. Android内存泄露总结

    内存泄露是如何产生的? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

  10. 写java代码有感。。。构造方法最好带着,

    (一) 小结:具体我最大的担心,害怕就是方法调用的时候,new对象之后,赋值,是在new后面的括号里实现,还是在 对象.方法名()这样的.当然带参数的构造方法,调用时本身就直接调用,普通方法,选后者. ...