首先,明确目标:我们要求所有素数,所以我们确定素数的标准:
只有1和它本身是因数,也就是只有两个因数。所以我们只要判断一个数的因数是否小于两个就可以了。我们写一个求一个数因数的代码。
def factor(x):
result = []
for i in range(1, x + 1): # 遍历从1到x的所有数
if x % i == 0: # 是否除尽
result.append(i)
return result
他返回的值是一个列表,如输入4210,返回[1, 2, 5, 10, 421, 842, 2105, 4210]这样我们就能知道一个数有几个因数了,就可以求出一个数是否为素数了。
def IfPrimeNumber(x):
factor_list_long = len(factor(x)) # 获取输入值的因数个数
if factor_list_long == 2: # 是二就是素数
return True
elif factor_list_long > 2: # 这里用elif是因为有1这个特例
return False
整个代码也就能拼凑出来了。注意,这里的文件保存在D:/PrimeNumber.txt
n = 0
def factor(x):
result = []
for i in range(1, x + 1): # 遍历从1到x的所有数
if x % i == 0: # 是否除尽
result.append(i)
return result
def IfPrimeNumber(x):
factor_list_long = len(factor(x)) # 获取输入值的因数个数
if factor_list_long == 2: # 是二就是素数
return True
elif factor_list_long > 2: # 这里用elif是因为有1这个特例
return False
while True:
n += 1
if IfPrimeNumber(n):
with open("D:/PrimeNumber.txt", "a") as f:
f.write("{0}\n".format(n)) # 不要问我为什么要加\n,问就是因为有亿点怪
print(f) # 不加可能速度更快,但加了效果更好
运行一下就知道,效果不那么好,这显然不是我想要的。所以,改亿下,只求一个数能否被所有素数整除就可以了。
最终源代码(知道你们要拷)就出现了。
x = 1
N = [2] # 一个素数列表
with open("D:/PrimeNumber.txt", "w") as f: # 2是个特殊的素数
f.write("2\n")
def IfPrimeNumber(number):
n = number / 2
for i in N:
if i <= n: # 因为大于他一半的数,已经不可能被整除了,所以加上这一行代码
if number % i == 0:
return False
else:
return True
while True:
x += 2 # 除二以外,没有偶素数
with open("D:/PrimeNumber.txt", "w") as f:
f.write("{0}\n".format(x))
print(x)
N.append(x) # 素数列表更新