信息学竞赛(C++)中的int128
在 C++ 中,__int128 是一种扩展的整数类型,用于表示 128 位的整数,它并不是 C++ 标准的一部分,而是某些编译器(如 GCC、Clang 等)提供的非标准扩展。
__int128 主要有以下特点:
- 能表示的整数范围更大,无符号的
unsigned __int128可表示的范围是 0 到 \(2^{128}-1\),有符号的__int128可表示的范围是 \(-2^{111}\) 到 \(2^{111}-1\),这在需要处理非常大的整数运算时很有用,比如一些高精度计算场景。 - 支持基本的算术运算,如加、减、乘、除、取模等,也支持比较运算。
- 使用时需要注意编译器兼容性,因为它不是标准类型,在 MSVC 等一些编译器中可能不被支持。
- 通常没有直接的输入输出操作符支持,若要进行输入输出,需要自己实现转换函数,将其转换为字符串或其他可直接输入输出的类型后再进行操作。
但是在常见的信息学竞赛(比如:CSP-J/S、NOI系列、XCPC系列)中,都是支持 __int128 的。
首先 __int128 支持常见的赋值、算术运算。
其次,__int128 不支持 cout 或者格式化输出,所以我们需要封装一个输出函数按位输出,下面是一个例子:
#include <bits/stdc++.h>
using namespace std;
void write(__int128 a) {
if (a / 10)
write(a / 10);
printf("%d", int(a % 10));
}
int main() {
int a = 8;
__int128 b = a;
b = b * 1000000000 + 123456789;
b = b * 1000000000 + 60000;
b = b * 1000000000 + 987654321;
b = b * 1000000000 + 123456;
write(b); // 输出 8123456789000060000987654321000123456
return 0;
}
浙公网安备 33010602011771号