信息学竞赛(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;
}
posted @ 2025-09-01 15:18  quanjun  阅读(372)  评论(0)    收藏  举报