创建一个函数,在给定的最大值下返回素数



指令是编写一个函数,返回某个最大值以下的所有素数。函数is_factor已经给出了,其他的都是我写的。当我运行代码时,我不会收到错误消息或任何东西,它只是空白的。我想我遗漏了什么,但我不知道那是什么。

def is_factor(d, n):
""" True if `d` is a divisor of `n` """
return n % d == 0
def return_primes(max):
result = []
i = 0
while i < max:
if is_factor == True:
return result
i += 1

您应该针对小于math.sqrt(i)的所有除数测试每个i。使用内环。CCD_ 3收集结果。不要马上退回result,因为你应该先把它填满。

def return_primes(max):
result = []
for i in range(2, max):
if not any(is_factor(j, i) for j in range(2, int(math.sqrt(i)) + 1)):
result.append(i)
return result
print(return_primes(10))

附带说明一下,使用forrange而不是while可以减少错误,使代码更加清晰。

运行代码时返回空白的原因是您将函数类型与True的值进行比较,而不是调用它。

print(is_factor)
<function is_factor at 0x7f8c80275dc0>

换句话说,您正在对对象本身进行比较,而不是调用函数。

相反,如果你想调用函数并检查它的返回值,你必须使用这样的括号:

if(is_factor(a, b) == True):

甚至更好的

if(is_factor(a, b)):

它将固有地检查函数是否返回True,而无需指定。

此外,如果条件未触发,则不会在代码中返回任何内容。我建议您在代码末尾包含一个默认的return语句,而不仅仅是在条件本身中

现在,就你的整体问题和问题的解决方案而言;"如何编写程序来计算某个最大值以下的素数">

首先,素数由"1"定义;任何大于1且只有两个因子的数,即1和它本身">

https://www.splashlearn.com/math-vocabulary/algebra/prime-number

这意味着你不应该在循环中包括1,否则每个数字都可以被1整除,这可能会打乱你试图创建的列表。

我的建议是从2开始计数,然后可以在函数末尾加1作为素数。

在讨论一般答案和算法之前,我想解决您的代码中的一些问题:

  1. 建议为变量使用除max之外的其他名称,因为max()是python中常用的函数
  2. 除以0是无效的,可能会破坏程序中的数学运算。最好检查你除以的数字,确保它不是零,以确保你不会遇到数学问题。或者,如果你从2开始计数,你就不会有这个问题
  3. 目前,您没有将任何内容附加到结果数组中,这意味着不会返回任何结果。我的建议是,一旦找到素数,就将其添加到结果数组中
  4. 现在,一旦计算出第一个结果,就返回results数组。这是一个问题,因为你试图捕获特定数字下面的所有素数,因此你需要多个结果

您可以通过在函数末尾而不是中间返回结果数组来解决此问题,并确保在发现每个素数时将其追加。

  1. 您需要检查2和最大值之间的每个数字,看看它是否是素数。您当前的代码只检查最大值本身,而不检查介于两者之间的数字

现在我将解释我推荐的答案及其背后的算法;

def is_factor(d, n):
print("Checking if " + str(n) + " is divisible by " + str(d))
print(n % d == 0)
return n % d == 0
def return_primes(max_num):
result = []
for q in range(2, max_num+1):
count_number_of_trues = 0
for i in range(2, q):
if(i != q):
if(is_factor(i, q)):
print("I " + str(i) + " is a factor of Q " + str(q))
count_number_of_trues += 1
if(q not in result and count_number_of_trues == 0):
result.append(q)  
result.append(1)
return sorted(result)
print(return_primes(10))

中心算法是,你想从2开始计数,一直到你的最大值。这由第一个循环表示。

然后,对于这些数字中的每一个,你应该检查从2到那个数字的每个数字,看看是否存在除数。

然后,你应该计算第二个数字是第一个数字的因子的次数,如果最后得到0次,那么你知道它一定是素数。

Example:
Q=10
"Is I a factor of Q?"
I:
9 - False
8 - False
7 - False
6 - False
5 - True
4 - False
3 - False
2 - True

因此,对于数字10,我们可以看到有2个因子,5和2(如果你包括1,从技术上讲是3,但这是为以后保存的)。

因此,因为10有2个因子[不包括1],所以它不可能是素数。

现在让我们使用7作为下一个例子。

Example:
Q=7
"Is I a factor of Q?"
I:     
6 - False
5 - False
4 - False
3 - False
2 - False

注意,7之前的每个数字一直到2都不是一个因子,因此7是素数。

所以你所需要做的就是循环从2到你的最大值的每个数字,然后在另一个循环中,循环从2直到当前数字的每个数字。

然后计算因子的总数,如果计数等于0,那么你就知道这个数字一定是素数。

一些附加建议:

  • 虽然循环的作用与for循环相同,但在python中使用for循环通常更方便,因为它们可以为您初始化计数,并可以为您节省一些代码行。此外,for循环将为您处理递增过程,因此不会有遗忘的风险
  • 我建议您在返回列表时对其进行排序,这样看起来更好
  • 在将素数添加到结果列表中之前,请检查它是否已经在列表中,这样您就不会遇到添加相同数字的倍数的情况(例如[2,2,2])

请注意,有很多不同的方法可以实现这一点,我的例子只是众多可能答案之一

最新更新