将vb.net代码转换为python以用于学习。数字值未输出
我平时的工作主要是用vb.net编程,所以我对它非常熟悉。在做前几道Project Euler的题目时,我用vb.net来熟悉题目的风格。现在我想用Project 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
但是,结果却没有打印出任何因数。我是不是漏掉了Python中的某些细节?我可能哪里出错了呢?谢谢 :)
1 个回答
2
之前的解决方案产生了错误的答案。
- VB.net 代码处理的是整数,而你的 Python 代码处理的是浮点数,这在某个地方显然出错了。
- 之前提到过,关键字的大小写(True/False)要注意。
- 你可以放心使用 foo % bar == 0。
- 在 "factor = 0" 这一行,你少了一层缩进。
这段代码能正确输出答案,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