在 ACM 竞赛中,如果 8e18 的 long long
不够用了,又不是特别需要高精度,可以使用 __int128
。
__int128
的数据范围是 -170141183460469231731687303715884105728
~ 170141183460469231731687303715884105727
(1e38)。
但是并不是很好用额:
- 只能在 64 位环境下使用,32 位是不支持
__int128
的。 - Visual Studio 2017 不支持,GCC支持。
- 不能使用
scanf/cin
和printf/cout
输出。一个解决方案是,可以把转化为字符输出,即 ACM/OI 常提到的快速读入输出。
1 | inline __int128 read() |
1 | void print(__int128 x) |
注意后面的 print
函数其实是不能输出 __int128
的最小值 -170141183460469231731687303715884105728
的,因为它是把负数取反后输出的,而补码系统里面,负数本身就比正数多一个数。不过平时影响不大,毕竟用不到这个数。