使用python将低于10000的素数加起来

时间:2013-10-22 17:06:59

标签: python primes

def is_divisible(num,prime=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]):
    for j in prime:
        if (num % j) == 0:
            return True
    return False

第一部分

def find_primes(N):
    prime = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]
    primes = []
    n = range(2,N+1)
    for num in n:
        if is_divisible(num) is False:
            primes.append(num)
    return(prime+primes)

第二部分

def brun(N):
    list = find_primes(N-1)
    list2 = find_primes(N)
    combs = []
    for x in list:
        for y in list2:
            if x - y ==2:
                combs.append((1/x)+(1/y))

print(brun(10000))

运行这个程序,最后我得到了一个无。我不知道有什么问题,请帮忙

2 个答案:

答案 0 :(得分:4)

brun没有return语句,因此默认情况下返回None。因此print(brun(10000))打印None

修改:如下所述,您可能希望在return combs的末尾添加brun语句。但是,combs是一个包含N(N-1)/2元素的列表,因此我怀疑您是否要打印整个内容。您可能想要打印类似

的内容
print(brun(10000)[-1])

将打印combs的最后一个元素。

答案 1 :(得分:2)

@Bill正确回答了你的问题。但是,让我花点时间建议一个更好的算法;它被称为Eratosthenes的筛子,是两千多年前希腊数学家发明的。我们的想法是首先将所有小于 n 的数字标记为可能的素数,然后为每个素数按顺序将所有的倍数标记为非素数,并随时收集素数:

def primes(n):
    sieve, ps = [True] * n, []
    for p in xrange(2, n):
        if sieve[p]:
            ps.append(p)
            for i in xrange(p*p, n, p):
                sieve[i] = False
    return ps

然后,您可以通过说sum(primes(n))来计算小于 n 的素数之和。如果您对使用素数进行编程感兴趣,我会在我的博客上谦虚地推荐this essay