请记住,我几天前才开始学习Python(第一语言)。
我试图找到一个给定的(潜在的)大整数“a”的最大素因子我首先定义一个函数prime(n),它检查整数“n”是否为prime然后,我从最大到最小找到a的因子n,并用素数(n)检查每个因子。如果找到一个素数n,它就会被打印出来,我用break结束这个过程。如果n=1是唯一找到的素因子,那么‘a’就是素,所以它最大的素因子就是它自己。
这个脚本完全失败了。变量n_prime返回到我第一次给它的任何值,即使在prime(n)应该将其更改为True或False之后如果我从它是无开始,在素数(n)之后,它总是保持无。
我希望不会太混乱,我的代码也不会有太多问题。

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

最佳答案

您的代码无法工作,因为您的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是prime时),只需将循环更改为以a开始,而不是以a-1开始。因为您在看到n是除数之后检查它是否是素数,所以只有当prime函数确认a没有任何因子(除了它本身和一个因子)时,才会打印出消息。

关于algorithm - 初学者(Python 3.6.1):为什么此脚本不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45253086/

10-16 17:01