如何计算前n个素数?

时间:2009-11-23 06:03:34

标签: primes

假设函数is_prime的可用性。假设变量n已与正整数相关联。写下计算前n个素数之和所需的语句。总和应与变量total相关联。

注意:is_prime将整数作为参数,当且仅当该整数为素数时才返回True。 好吧,我写了这样的is_prime函数:

def is_prime(n):
    n = abs(n)
    i = 2
    while i < n:
        if n % i == 0:
            return False
        i += 1
    return True

但除n == 0外,它有效。如何修复它以使其适用于每个整数? 我试图找到如何编写函数以获得前n个素数之和以及如何修改我的is_prime函数的答案,这应该适用于所有可能的输入,而不仅仅是正数。

5 个答案:

答案 0 :(得分:5)

您的作业如下。

  

假设函数is_prime的可用性。假设变量n已与正整数相关联。写下计算前n个素数之和所需的语句。总和应该与变量total相关联。

正如NVRAM在评论中正确指出的那样(并没有其他人似乎已经接受),问题是“假设函数is_prime的可用性”。

你没有来编写该功能。你要做的就是“编写计算前n个素数之和所需的语句”。

伪代码就像:

primes_left = n
curr_num = 2
curr_sum = 0
while primes_left > 0:
    if is_prime(curr_num):
        curr_sum = curr_sum + curr_num
        primes_left = primes_left - 1
    curr_num = curr_num + 1
print "Sum of first " + n + " primes is " + curr_sum

我想你会发现,如果你只是用你选择的语言实现那个伪代码,那就是你要做的全部。

如果您正在寻找is_prime的实施来测试您的作业,那么它的效率并不重要,因为您无论如何都只会测试一些小值。考虑到将使用它的代码的限制,您也不必担心少于两个的数字。这样的事情是完全可以接受的:

def is_prime(num):
    if num < 2:
        return false
    if num == 2:
        return true
    divisor = 2
    while divisor * divisor <= num:
        if num % divisor == 0:
            return false
        divisor = divisor + 1
    return true

答案 1 :(得分:2)

在你的问题陈述中,它说n是一个正整数。所以assert(n>0)并确保您的程序外循环永远不会is_prime()具有负值而不是零。

你的算法 - 每个连续的 奇数 数字的试验分割('奇数'对你来说是一个主要的加速) - 有效但是将会是非常慢。看看prime sieve的灵感。

答案 2 :(得分:0)

为什么不对i = 0或1的答案进行硬编码?

n = abs(n)
i = 2
if(n == 0 || n == 1)
   return true //Or whatever you feel 0 or 1 should return.
while i < n:
    if n % i == 0:
        return False
    i += 1
return True

您可以通过省略一些数字来进一步提高算法的速度。此脚本仅检查n的平方根为如果数字具有一个或多个因子,则没有复合数字具有大于其平方根的因子,将在该数字的平方根之前遇到一个因子。在测试大数字时,这会产生很大的差异。

n = abs(n)
i = 2
if(n == 0 || n == 1)
   return true //Or whatever you feel 0 or 1 should return.
while i <= sqrt(n):
    if n % i == 0:
        return False
    i += 1
return True

答案 3 :(得分:0)

那么,当n为0或1时会发生什么?

你有

i = 2
while i < n: #is 2 less than 0 (or 1?)
     ...
return True

如果您想要0或1中的n返回False,那么这是否表示您需要修改条件(或函数本身)来解释这些情况?

答案 4 :(得分:-1)

试试这个:

 if(n==0)
    return true
 else
    n = abs(n)
    i = 2
    while i < n:
        if n % i == 0:
            return False
        i += 1
    return True