我的日常工作主要是在vb.net中编码,所以我对它非常熟悉。在做我最初的几十个项目euler问题时,我使用vb.net来解决问题风格。现在我想使用项目euler来帮助我学习一门新语言,并且已经在python中运行了一对。然而。我遇到了麻烦。
以下代码将打印给定数字的最大素数因子:
Protected Function isPrime(ByVal n As Long) As Boolean
If n = 2 Then
Return True
End If
If n Mod 2 = 0 Then
Return False
End If
Dim maxFactor As Long = Math.Sqrt(n)
Dim i As Integer = 3
While i <= maxFactor
If n Mod i = 0 Then
Return False
End If
i = i + 2
End While
Return True
End Function
Protected Sub LargestPrimeFactor(ByVal n As Long)
Dim factor As Long = Math.Sqrt(n) ''#largest factor of n will be sqrt(n)
While factor > 2
If (n Mod factor) = 0 Then
If isPrime(factor) Then
Me.lblAnswer.Text = factor
factor = 0
End If
End If
factor = factor - 1
End While
End Sub
此vb.net代码运行完美。 python中的等价物,我相信是:
from math import sqrt
def IsPrime(n):
if n==2: return true
if not n % 2: return false
maxFactor = sqrt(n)
i = 3
while i <= maxFactor:
if not n % i: return false
i += 2
return true
n = 600851475143
factor = sqrt(n)
while factor > 2:
if not n % factor:
if IsPrime(factor):
print factor
factor = 0
factor -= 1
然而,该因素永远不会结束印刷。我错过了蟒蛇的细微差别吗?我哪里可能出错了?谢谢:))
答案 0 :(得分:2)
以前的解决方案会产生错误的答案。
此代码生成正确的答案,6857:
from math import sqrt
def IsPrime(n):
if n==2: return True
if n % 2 == 0: return False
maxFactor = long(sqrt(n))
i = 3
while i <= maxFactor:
if n % i == 0: return False
i += 2
return True
n = 600851475143
factor = long(sqrt(n))
while factor > 2:
if n % factor == 0:
if IsPrime(factor):
print factor
factor = 0
factor -= 1