Loops 在Python中查找列表中素数的和
我试着把这个问题作为练习,但我被卡住了。我会尽可能精确地回答 我想用列表作为输入来求素数的和 假设给我的函数的输入是一个类似=[17,51,29,39]的列表,那么它应该返回46作为17+29=46的答案 以下是我可以编写的代码:Loops 在Python中查找列表中素数的和,loops,python-3.x,math,Loops,Python 3.x,Math,我试着把这个问题作为练习,但我被卡住了。我会尽可能精确地回答 我想用列表作为输入来求素数的和 假设给我的函数的输入是一个类似=[17,51,29,39]的列表,那么它应该返回46作为17+29=46的答案 以下是我可以编写的代码: def sumprimes(l): sum=0 for value in l: for i in range(1,float((value)/2)): if value%i==0:
def sumprimes(l):
sum=0
for value in l:
for i in range(1,float((value)/2)):
if value%i==0:
sum+=value
print(sum)
注意:在传递列表时,程序应该工作。我还没有写这部分
提前感谢您的代码的问题是您使用的是带浮点值的
范围
。
这里真正需要的是整数除法。在Python 3中,这是/
操作符:
def sum_primes(l):
total = 0
for value in l:
for i in range(2, value // 2):
if value%i == 0:
break
else:
total += value
return total
此外,您还需要检查值是否可以被除1和自身之外的每个数字整除。所有数字都可以被1整除。因此,从2开始计算范围。此外,不是素数的是可除的数,因此在for循环中添加一个else子句,该子句仅在for循环完成且未中断时执行,即,您选中的任何数都不能除值,因此值为素数 代码的问题在于,您使用的是带浮点值的
range
。
这里真正需要的是整数除法。在Python 3中,这是/
操作符:
def sum_primes(l):
total = 0
for value in l:
for i in range(2, value // 2):
if value%i == 0:
break
else:
total += value
return total
此外,您还需要检查值是否可以被除1和自身之外的每个数字整除。所有数字都可以被1整除。因此,从2开始计算范围。此外,不是素数的是可除的数,因此在for循环中添加一个else子句,该子句仅在for循环完成且未中断时执行,即,您选中的任何数都不能除值,因此值为素数 您最好创建一个函数来测试数字是否是@wim所说的素数
def is_prime(n):
if n < 2:
return False
elif n <= 3:
return True
elif n % 2 == 0:
return False
# round up the sqrt of n
length = int(n**.5) + 1 # n**.5 is equal to sqrt(n)
for i in range(3, length, 2):
if n % i == 0:
return False
return True
您最好创建一个函数来测试数字是否是@wim所说的素数
def is_prime(n):
if n < 2:
return False
elif n <= 3:
return True
elif n % 2 == 0:
return False
# round up the sqrt of n
length = int(n**.5) + 1 # n**.5 is equal to sqrt(n)
for i in range(3, length, 2):
if n % i == 0:
return False
return True
这是您的查询的解决方案
def sumprimes(l):
primeNum = []
for item in l:
is_prime = True
if(item >= 2):
maxInt = int(item ** 0.5) + 1
for i in range(2, maxInt):
if(item % i == 0):
is_prime = False
break
if(is_prime):
primeNum.append(item)
return(sum(primeNum))
print(function([-3,1,6]))
这是您的查询的解决方案
def sumprimes(l):
primeNum = []
for item in l:
is_prime = True
if(item >= 2):
maxInt = int(item ** 0.5) + 1
for i in range(2, maxInt):
if(item % i == 0):
is_prime = False
break
if(is_prime):
primeNum.append(item)
return(sum(primeNum))
print(function([-3,1,6]))
为什么不先创建一个单独的函数来判断一个数字是否为素数。为什么不先创建一个单独的函数来判断一个数字是否为素数。这样可以提高效率<代码>类iPrime:;定义初始值(自):;self.prime_set=set([2]);def是_prime(自,n);如果在self.prime_集合中为n:返回true;#2总是在集合中,所以这里的偶数都是非素数;如果不是n%2:返回false;长度=int(n**.5)+1#n**.5等于sqrt(n);对于范围(3,长度,2)内的i:;如果n%i==0:;返回False;自素数集加(n);返回True代码>这是一个简单的集合添加,用于存储以前找到的素数。这就省去了重新生成它们的麻烦。另一种方法是生成所有的素数,直到值。这允许进行两个进一步的优化:1)如果该值不在集合中,但集合中的值大于该值,则该值不是素数。2) 对于大于最大素数的值,您只需对已知素数进行测试,而不是对所有达到该值的奇数进行测试。这对于单个调用来说效率较低,但对于提问者提出的对is_prime()的多次调用来说效率要高得多。您可以使其更有效<代码>类iPrime:;定义初始值(自):;self.prime_set=set([2]);def是_prime(自,n);如果在self.prime_集合中为n:返回true;#2总是在集合中,所以这里的偶数都是非素数;如果不是n%2:返回false;长度=int(n**.5)+1#n**.5等于sqrt(n);对于范围(3,长度,2)内的i:;如果n%i==0:;返回False;自素数集加(n);返回True代码>这是一个简单的集合添加,用于存储以前找到的素数。这就省去了重新生成它们的麻烦。另一种方法是生成所有的素数,直到值。这允许进行两个进一步的优化:1)如果该值不在集合中,但集合中的值大于该值,则该值不是素数。2) 对于大于最大素数的值,您只需对已知素数进行测试,而不是对所有达到该值的奇数进行测试。这对于单个调用来说效率较低,但是对于提问者提出的对is_prime()的多次调用来说效率要高得多。对于给定的列表分区,通过使用筛选函数和应用sum()函数添加新列表中的所有元素,基于prime(n)对列表进行分区。对于给定的列表分区,基于prime(n)对列表进行分区通过使用filter函数和apply sum()函数将所有元素添加到新列表中。