反转负整数会导致意外结果

mar*_*lee 5 python

我写了一个代码来反转 Python 中的给定整数。预期的输入和输出如下:

(1)

输入:123 输出:321

(2)

输入:-123 输出:-321

def reverse(num):
    result = 0
    repeat = len(str(num))
    original_num = num

    if original_num < 0:
        num *= -1
    else:
        pass

    for i in range(repeat):
        mod = num % 10
        num //= 10
        result = result * 10 + mod

    if original_num < 0:
        result *= -1
    return result
Run Code Online (Sandbox Code Playgroud)

当输入为正时,输出与我预期的一样。但是当输入为负时,结果在输出的末尾添加了一个意想不到的0,所以当输入为 时-123,输出为-3210

有人能告诉我这个错误是从哪里来的吗?

abh*_*ora 1

repeat = len(str(num))您在更改负数的符号之前已设置,如果 num 为负数,则应将其递减。在循环的最后一次迭代中for(如果 num 为负数),mod将始终为零,因此,如果 num 为负数,您将始终附加零。

如果我要解决这个问题,那么我可能会这样写:

def reverse(num):
    sign = num >= 0 # True if num is +ve. False if num is -ve
    num = abs(num)
    repeat = len(str(num))

    result = 0
    for i in range(repeat):
        mod = num % 10
        num //= 10
        result = result * 10 + mod

    return result if sign else -result

print(reverse(123))
print(reverse(-123))
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以解决这个问题,它更紧凑:

def revdigits(num):
    reverseStr = lambda s: "".join(reversed(s))
    digits = reverseStr(str(num)) if num >= 0 else ("-" + reverseStr(str(num)[1:]))
    return int(digits)

num = 123
print(revdigits(num))
print(revdigits(-num))
Run Code Online (Sandbox Code Playgroud)

输出:

321
-321
Run Code Online (Sandbox Code Playgroud)