【问题标题】:Beginner (Python 3.6.1): Why isn't this script working?初学者(Python 3.6.1):为什么这个脚本不起作用?
【发布时间】:2017-07-22 09:45:51
【问题描述】:

请记住,我几天前才开始学习 Python(第一语言)。

我正在尝试找到给定(并且可能很大)整数“a”的最大素数。我首先定义一个检查整数“n”是否为素数的函数 prime(n)。然后我从最大到最小找到“a”的因子“n”,并用素数(n)检查每个因子。如果找到素数 n,则将其打印出来,然后我使用 break 来结束该过程。如果 n=1 是唯一找到的素因数,那么 'a' 是素数,因此它的最大素因数就是它自己。

此脚本完全失败。即使在 prime(n) 应该将其更改为 True 或 False 之后,变量 n_prime 也会返回到我第一次给它的任何值。如果我从 None 开始,在 prime(n) 之后,它始终保持 None。

我希望它不会太乱,并且我的代码不会有太多问题。

def prime(n): 
if n == 1:
    n_prime = False

if n == 2:
    n_prime = True

if n == 3:
    n_prime = True

if n % 2 == 0 and n_prime != True:
    n_prime = False

else:
    for i in range(3, n, 2):
        if i != n:
            if n % i == 0:
                n_prime = False
                break
        else:
            n_prime = True



n_prime = None
a = int(input())

for n in range (a-1, 1, -1):

     if a % n == 0:
          prime(n)
          if n_prime==True:
               if n != 1:
                   print(n, ' is the greatest prime factor of ', a)
                   break
               else:
                   print(a, 'is the greatest prime factor of ', a)
                   break

【问题讨论】:

  • 我不知道这是否是您的帖子副本中的拼写错误,但def prime(n): 之后的整个代码块需要缩进。
  • 你的缩进看起来不对。
  • 在我的代码中,没问题。这是一个复制粘贴问题。
  • 你应该使用return而不是全局变量来获得prime的结果。
  • 由于缩进在 Python 中很重要,您应该真正解决复制和粘贴问题(否则很难判断函数何时结束以及其他代码何时开始)。

标签: algorithm python-3.x


【解决方案1】:

您的代码不起作用,因为您的 prime 函数没有像您期望的那样修改全局变量 n_prime。您可以通过在函数顶部添加global 语句使其工作:global n_prime。但这不是最好的方法。从函数内部修改全局变量会失去函数提供的许多好处。

更好的方法是return要在调用代码中使用的值:

def prime(n): 
    if n == 2 or n == 3: # We can reorder and combine some of the conditions up here
        return True # return instead of trying to assign to the global variable!

    if n == 1 or n % 2 == 0:
        return False

    for i in range(3, n, 2): # The end value of a range is not used in the iteration.
        if n % i == 0:       # So the logic that was checking `i != n` is unnecessary.
            return False

    return True  # if the loop finished without returning, we know our value is prime

这是我在您展示的最大素数算法中使用该函数的方式:

a = int(input())

for n in range (a-1, 1, -1): # This loop stops at 2. It doesn't ever reach 1, but that's OK!
    if a % n == 0 and prime(n): # Test the return value from the function here!
        print(n, ' is the greatest prime factor of ', a)
        break
else: # This else block is attached to the loop. It runs only if the loop didn't `break`.
    print(a, 'is the greatest prime factor of ', a)

请注意,没有必要将布尔值与另一个值进行比较(例如 n_prime == True。只需在 if 中直接使用布尔值(或使用布尔运算符,如 andor)。

我还要注意,您可以在最后摆脱特殊情况(当a 为素数时),只需将循环更改为以a 而不是a-1 开头。由于您在看到 n 是除数后检查它是否为素数,因此只有在 prime 函数确认 a 没有因子(除了它自己和一个因子)时才会打印出消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2020-12-14
    • 2013-10-20
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多