将vb.net代码转换为python以用于学习。数字值未输出

4 投票
1 回答
589 浏览
提问于 2025-04-15 14:09

我平时的工作主要是用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

之前的解决方案产生了错误的答案。

  1. VB.net 代码处理的是整数,而你的 Python 代码处理的是浮点数,这在某个地方显然出错了。
  2. 之前提到过,关键字的大小写(True/False)要注意。
  3. 你可以放心使用 foo % bar == 0。
  4. 在 "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

撰写回答