python

时间:2017-10-03 13:10:47

标签: python math primes floor floor-division

我试图解决hackerrank中的this问题。在某些时候,我必须检查数字是否除以n(给定输入)。

除了一个测试用例(不是问题)之外,这段代码非常有效:

if __name__ == '__main__':
    tc = int(input().strip())
    for i_tc in range(tc):
        n = int(input().strip())
        while n % 2 == 0 and n is not 0:
            n >>= 1
        last = 0



        for i in range(3, int(n ** 0.5), 2):
            while n % i == 0 and n > 0:
                last = n
                n = n // i        # Concentrate here


        print(n if n > 2 else last)

现在你可以看到我只在i是n的因子时除以数字。例如,如果数字是i = 2且n = 4那么n / 2和n // 2不是&#39 ; t使任何差异都正确。

但是当我使用下面的代码时,所有测试用例都会失败:

if __name__ == '__main__':
    tc = int(input().strip())
    for i_tc in range(tc):
        n = int(input().strip())
        while n % 2 == 0 and n is not 0:
            n >>= 1
        last = 0
        for i in range(3, int(n ** 0.5), 2):
            while n % i == 0 and n > 0:
                last = n
                n = n / i      # Notice this is not //
        print(n if n > 2 else last)

这不是第一次。即使this问题,我也遇到了同样的问题。对于这个问题我只需要除以2,所以我使用右移操作符来摆脱这个。但是我可以& #39; t做任何事情,因为右移不能帮助我。

为什么会这样?如果数字很小,我看不出任何差异,但随着数字变大,它在某种程度上表现不同。

在/失败时使用//甚至不直观。这是什么原因?

1 个答案:

答案 0 :(得分:9)

鉴于n // in / i属于niintn % i == 0之间存在差异的主要原因是

  1. n // i的类型仍然是int,而n / i的类型是float
  2. Python中的
  3. 整数具有无限的精度,而浮点数的精度是有限的。
  4. 因此,如果n // i的值超出了python float类型可准确表示的范围,那么它将不等于n / i的计算值。 / p>

    插图:

    >>> (10**16-2)/2 == (10**16-2)//2
    True
    >>> (10**17-2)/2 == (10**17-2)//2
    False
    >>> int((10**17-2)//2)
    49999999999999999
    >>> int((10**17-2)/2)
    50000000000000000
    >>>