求100以内素数的5中基本方法及其优化
方法1 基本做法
错解比较:进入了小循环:有时加pass也可以。
错解:
这里的print也同样注意不要写到循环内。
注释:
1.两种条件运用:为合数。
2.以上错误点。
方法二
注释;1.条件运用,质数除了2都是奇数,因为偶数都能被除了自身外的2整除。改进自1
2.偶数除了2都不是质数。
3.第二个for写的是到开方的奇数。
4.奇数含有质数和非质数。偶数除了2一定不是质数。所以先剥离了偶数。
方法三:使用列表
注释:1.break continue pass
2.质数i依然是从奇数中选。
3.条件应用,一个数如果能被一个素数整除,那它是合数。
4.用列表primenumber[]存储质数作为被除数。
方法四 本做法及优化
1.本做法
注释:
1.利用以前的结果,把之前的质数结果用起来了。得知道一些规律。质数等于质数的乘机
记住一些记好了。冒泡法(算法)记不住,所以换算法。
2.if i>x0.5,即i都大于x0.5依然未被整除(因为未走上一个分支,相当于截胡在这里,而来/走这个分支)。
拿一定是质数。上边一个if相当于判断是否是合数。下边的是在上边的基础上告知你都到x**0.5,依然未被break,
肯定是质数。??两个If与上边for 的关系,是否如上所述:先走上边if循环,如果还未被整除,那么。
测试:发现是一个数值x先走了两个if.相当于一根管子有两个阀门。是直的
测试:
测时间差,看优化性
2.on优化。每次都开方太耗时。放在相应的循环层次上减少循环每次都计算/分摊平方。
方法五 条件:大于3的素数只有6N+1和6N-1两种形式,但反过来不成立。但是比如25(非质数)和23,是这种,但不成立。也即23没有孪生质数。
**推到出其他隐藏情况【除了2,3】
1.6N只表示6的倍数,各个数字的N不尽相同,N相同的情况下互为孪生,N=1比如5 7。
2.排序的话N是一位一位往上加的依次是N=1 5 7 ; N=2 11 13 ....。
3.由此推到出两个相邻的孪生组的相接的两个数的差为4,孪生组之间的差为2(delta=6N+1-6N+1=2)。本体为依次隐藏情况为打码解题条件。(或通过看下边的列举,得出结论,有可能是错误的特别是含有倍数的情况,越往上随着循环还会delta更大如下应该是2,4,2,4,...,2,4,6)
孪生素数即6n+1与6n-1。而其
Range函数只定值一次。相当于不变。所以补偿该此案放在下边。
4.**错误:打印未在else循环内,打印出的必然是未经筛选的
正确:print要在else内,否则无法筛选25等。print要在x +=前,否则累加的25等也会被打印。即非质数的6N+1。
原文地址:http://blog.51cto.com/13889496/2158298