请记住,我几天前才开始学习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
答案 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
没有因子(除了它自身)之外,这只会打印出来和一)。