初学者(Python 3.6.1):为什么这个脚本不起作用?

时间:2017-07-22 09:45:51

标签: algorithm python-3.x

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

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

此脚本完全失败。变量n_prime返回到我首先给它的任何值,即使在prime(n)之后应该将它改为True或False。如果我从它开始为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

1 个答案:

答案 0 :(得分:2)

您的代码无法正常运行,因为您的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中直接使用布尔值(或使用布尔运算符,如{ {1}}或and)。

我还注意到你可以在最后摆脱特殊情况(当or为素数时),只需将循环改为以a而不是{ {1}}。由于您在看到它是除数后检查a是否为素数,如果a-1函数确认n没有因子(除了它自身)之外,这只会打印出来和一)。