首页 > 解决方案 > (1e18+1)(1e18)/(1e18) 的除法在 Python 3.6 中给出 (1e18)

问题描述

下面是输入 n=(1e18+1)*(1e18) 和 k=(1e18) 的代码 &,代码应打印“YES”。但它打印“否”。这是因为“a”的值为 1e18。但理想情况下,'a' 应该是 (1e18+1)。请帮忙。

    for t in range(int(input())):
        n,k=input().split()
        n=int(n)
        k=int(k)
        if n>=k*k:
            a=n/k
            print("a is {}".format(a))
            if a%k==0: 
                print ("a%k is {} ans {}".format(a%k, "NO"))
            else: 
                print("a%k is {} ans {}".format(a%k, "YES"))
        else:
            print("YES")

输入:

3
1 1
30 5
1000000000000000001000000000000000000 1000000000000000000

输出:

a is 1.0
a%k is 0.0 and ans is NO
a is 6.0
a%k is 1.0 and ans is YES
a is 1e+18
a%k is 0.0 and ans is NO

标签: pythonpython-3.x

解决方案


这里的问题是您使用的是“正常”/除法,它总是产生一个浮点数。由于浮点数的精度有限,因此 1e18+1 会四舍五入为 1e18。

为了解决这个问题,使用整数除法//,它给出一个整数。

通过更改此行:

a = n // k

您的代码有效,如此示例输出所示:

1
1000000000000000001000000000000000000 1000000000000000000
a is 1000000000000000001
a%k is 1 ans YES

推荐阅读