我需要在Python中使用生成器生成素数.这是我的代码:
def genPrimes():
yield 2
x=2
while True:
x+=1
for p in genPrimes():
if (x%p)==0:
break
else:
yield x
Run Code Online (Sandbox Code Playgroud)
我有一个RuntimeError:当我运行它时,在第二个prime.next()之后超出了最大递归深度.
您好,有人能告诉我如何在此代码中实现Eratosthenes筛选以使其快速?如果你能用筛子完成它,将非常感谢帮助.在这个特定的代码中,我真的遇到了麻烦.
#!/usr/bin/env python
import sys
T=10 #no of test cases
t=open(sys.argv[1],'r').readlines()
import math
def is_prime(n):
if n == 2:
return True
if n%2 == 0 or n <= 1:
return False
sqr = int(math.sqrt(n)) + 1
for divisor in range(3, sqr, 2):
if n%divisor == 0:
return False
return True
#first line of each test case
a=[1,4,7,10,13,16,19,22,25,28]
count=0
for i in a:
b=t[i].split(" ")
c=b[1].split("\n")[0]
b=b[0]
for k in xrange(int(b)):
d=t[i+1].split(" ")
e=t[i+2].split(" ")
for g in d:
for j …Run Code Online (Sandbox Code Playgroud) 我在 python 中找到了一个示例代码,它给出了最多的所有素数n,但我就是不明白,为什么它会这样做?
我读过关于埃拉托斯特尼筛法的维基百科文章,但根本不知道它是如何工作的。
pp = 2
ps = [pp]
lim = raw_input("Generate prime numbers up to what number? : ")
while pp < int(lim):
pp += 1
for a in ps:
if pp%a==0:
break
else:
ps.append(pp)
print set(ps)
Run Code Online (Sandbox Code Playgroud)
对循环如何工作的解释将不胜感激。
编辑- 发现代码都是错误的,因为它表示 25 作为素数,通过更深入的搜索发现这不是筛子,有人可以展示一个利用 python 中的筛子的生成器并解释它
我正在编写一个代码,在一个名为primes.txt的文件中写入2到1000之间的所有素数.出于某种原因,我无法找出解决此问题的正确方法.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class Problem6 {
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
PrintWriter prw = new PrintWriter("primes.txt");
for (int i = 2; i <= 1000; i++){
if (checkIfPrime(i) == true){
System.out.println(i);
prw.println(i);
}
}
}
public static boolean checkIfPrime (int num){
boolean isPrime = true;
for (int i = 2; i <= 1000; i++){
if ( num % i == 0 ){
isPrime = false; …Run Code Online (Sandbox Code Playgroud) 我有一个素数生成器,我很好奇看到有多小和我有多快可以让素数生成器基于优化等等:
from math import sqrt
def p(n):
if n < 2: return []
s = [True]*(((n/2)-1+n%2)+1)
for i in range(int(sqrt(n)) >> 1):
if not s[i]: continue
for j in range( (i**i+(3*i) << 1) + 3, ((n/2)-1+n%2), (i<<1)+3): s[j] = False
q = [2]; q.extend([(i<<1) + 3 for i in range(((n/2)-1+n%2)) if s[i]]); return len(q), q
print p(input())
Run Code Online (Sandbox Code Playgroud)
发电机很棒!它速度超快,可以随意试用.但是,如果您输入的数字大于10 ^ 9或10 ^ 10(我认为),它将从内存错误中崩溃.我无法弄清楚如何扩展它使用的内存,以便它可以占用所需的内存.任何建议将不胜感激!
我的问题与此问题非常相似,但这是Python,而不是C.
编辑:这是我尝试运行10 ^ 9时获得的与内存相关的回溯之一.
python prime.py
1000000000
Traceback (most recent call last):
File "prime.py", line 9, …Run Code Online (Sandbox Code Playgroud)