寻找N以内的质数,可以将N除以N-1前的所有质数,如果存在整除,则N不是质数,如果不能够整除,则是质数
开始进行代码
# -*- coding: utf-8 -*-
"""
Created on 2018-02-06
Using by Notepad++
@author: Binjoy Hong
"""
#寻找N以内的质数
#核心思想:一个数能被它之前的任何质数整除,那么它就不是质数,不能被它之前的任何质数整除的数是质数
def Find_prime_num(N):
pri_collec=[2]
Now_prime_amount=1
i=3
while i <= N:
for cyc_j in range(0,Now_prime_amount)
if i % pri_collec[j] == 0:
break
else:
pri_collec.append(i)
Now_prime_amount+=1
i+=1
return pri_collec
a=Find_prime_num(10000) #寻找10000以内的质数
上述程序段中,会产生一个问题,在
for cyc_j in range(0,Now_prime_amount)
这一段开始,当任意数N只能够对pri_collec
列表第一个元素进行检验,然后看是否整除,但是不会对列表中第2个元素开始进行整除检验。然后,还会产生叠加现象,比如当i=5时,5除以2余数不为0,但再除以3时,也不为0,则5加进去2次。
上述程序段运行会将非质数元素添加进去
接下来解决叠加及含有非质数问题
问题出现在while
循环段,在该处作相应修改即可。下面是完整的代码
def Find_prime_num(N):
pri_collec=[2]
Now_prime_amount=1
i=3
while i <= N:
for cyc_j in range(0,Now_prime_amount):
if i%pri_collec[cyc_j]==0:
break
else:
pri_collec.append(i)
Now_prime_amount+=1
i+=1
return pri_collec
在上述错误产生的另外一个根本原因,是对循环控制语句的使用不熟悉所导致。
for…else
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行。while … else 也是一样。
添加功能
在完成了上述的主题功能后,如果我想计算程序在执行的时候使用了多少时间,然后总共循环了多少步。则代码:
import time
start_time1=time.clock()
def Find_prime_num(N):
pri_collec=[2]
Now_prime_amount=1
i=3
while i <= N:
for cyc_j in range(0,Now_prime_amount):
if i%pri_collec[cyc_j]==0:
break
else:
pri_collec.append(i)
Now_prime_amount+=1
i+=1
return pri_collec
a=Find_prime_num(10000)
end_time1=time.clock()
total_time1=end_time1-start_time1
total_step1=sum(list(range(3,len(a))),-2)
print('计算总共使用了',total_time1,'秒')
print('循环了',total_step1,'步')
同时,又学习了一个内置sum()
sum()
sum() 方法对系列进行求和计算。
下述代码摘自菜鸟教程
语法
以下是 sum() 方法的语法:
sum(iterable[, start])
参数
- iterable – 可迭代对象,如列表。
- start – 指定相加的参数,如果没有设置这个值,默认为0。
返回值
返回计算结果。
实例
>>>sum([0,1,2])
3
>>> sum((2, 3, 4), 1) # 元组计算总和后再加 1
10
>>> sum([0,1,2,3,4], 2) # 列表计算总和后再加 2
12