开始
在求解的同时
int(a/b) 和 a//b 之间的区别
因为诧异于 WA 和 AC 的变化,所以研究了其中的差异。
结论:
通过“a/b 返回 float,a//b 返回 int”,
区别在于是否发生溢出。
下面的代码不起作用
import math
a, b, c = map(int, input().split())
gcd = math.gcd(a, b)
gcd = math.gcd(gcd, c)
# 如果 1000000000000000000 999999999999999999 999999999999999998
# gcd == 1
a = int(a/gcd) - 1
b = int(b/gcd) - 1
c = int(c/gcd) - 1
print(a+b+c)
% python3 022_cubic_cake.py
1000000000000000000 999999999999999999 999999999999999998
2999999999999999997
下面的代码运行良好
import math
a, b, c = map(int, input().split())
gcd = math.gcd(a, b)
gcd = math.gcd(gcd, c)
# 如果1000000000000000000 999999999999999999 999999999999999998
# gcd == 1
a = a//gcd - 1 # 这是与上面的区别
b = b//gcd - 1 # 这是与上面的区别
c = c//gcd - 1 # 这是与上面的区别
print(a+b+c)
这个纯粹的问题点出 int(a/b) 和 a//b 之间的区别。
两者区别
查看下面的python文档
内置类型
- int 没有精度上限。
- float 是作为 C double 实现的。
另外,如果请查看下面的文档
浮点算术:争议和限制
事实证明,对于float来说,数字只能到第53位。
因为大于 53 位的数字只是近似值,所以无法产生正确的结果。
而事实上,这次处理的数字超过了53位。
% python3
>>> 2**53<1000000000000000000
True
换而言之,两者的区别在于准确率有上限吗?
事实证明确实如此:
具体而言,int 没有精度上限,float 的精度上限为 53 位。
概括
使人诧异的是整数(int)的精度没有上限……!
从今以后,将尽可能避免 int(a/b) ,并使用 a//b 代替。