假设函数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函数的答案,这应该适用于所有可能的输入,而不仅仅是正数。
答案 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