首先,明确目标:我们要求所有素数,所以我们确定素数的标准:
只有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("2n") 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) # 素数列表更新