news 2026/7/2 1:58:57

算法札记:C++ __int128

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法札记:C++ __int128

老纸不想写高精度

故学了下__int128

  • _int128(有符号)_

    • 类型:128位有符号整数
    • 最大能存:约170,141,183,460,469,231,731,687,303,715,884,105,727(约 1.7 × 10³⁸)
    • 十进制大约能存 39 位数。

不过,用的时候有两点要特别注意:

  1. 它不是标准C++‌:__int128是 GCC 和 Clang 编译器的扩展,Visual Studio 的 MSVC 编译器不支持。在竞赛或Linux环境下通常没问题。
  2. 输入输出麻烦‌:你不能直接用cincoutscanfprintf来读写__int128,需要自己写专门的快读快写函数。

输入输出

方法一:手写快读快写函数(最常用)

这是竞赛中最常见的方式,直接调用read()write()函数:

#include <iostream> #include <string> #include <algorithm> using namespace std; // 快读 __int128 read() { __int128 x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } // 快写 void write(__int128 x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) write(x / 10); putchar(x % 10 + '0'); } int main() { __int128 a = read(); __int128 b = read(); write(a + b); return 0; }

方法二:重载>><<运算符

重载之后就可以像普通类型一样直接用cin/cout了,写起来更顺手:

#include <iostream> #include <string> #include <algorithm> using namespace std; // 重载输入 istream& operator>>(istream& is, __int128& n) { string s; is >> s; n = 0; bool neg = false; int i = 0; if (s == '-') { neg = true; i = 1; } for (; i < s.size(); i++) { n = n * 10 + (s[i] - '0'); } if (neg) n = -n; return is; } // 重载输出 ostream& operator<<(ostream& os, __int128 n) { if (n == 0) return os << "0"; if (n < 0) { os << '-'; n = -n; } string s; while (n) { s.push_back('0' + n % 10); n /= 10; } reverse(s.begin(), s.end()); return os << s; } int main() { __int128 a, b; cin >> a >> b; cout << a + b << endl; return 0; }

需要注意的点

  • 编译器限制‌:__int128是 GCC 和 Clang 的扩展,MSVC(Visual Studio)不支持,在 Linux 或竞赛环境(如洛谷、Codeforces)中通常没问题。
  • 性能‌:重载运算符内部用字符串转换,效率比快读快写稍低,但一般够用。如果数据量极大(比如百万级),建议用getchar/putchar版本的快读快写。
  • 负数处理‌:写函数时别忘了处理负号,否则输出会出错。

还不如写高精度呢,超

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 1:57:00

EM3080-W与PIC32MZ的嵌入式条形码解码系统设计

1. EM3080-W与PIC32MZ的条形码解码系统设计背景在零售仓储、物流分拣和工业自动化领域&#xff0c;条形码识别系统的响应速度和准确率直接决定了整体作业效率。传统方案通常采用通用摄像头软件解码的方式&#xff0c;存在功耗高、延迟大&#xff08;普遍在200-300ms&#xff09…

作者头像 李华
网站建设 2026/7/2 1:54:50

WebAssembly 跨语言互操作:数据传递成本比想象中更重要

WebAssembly 跨语言互操作&#xff1a;数据传递成本比想象中更重要 一、互操作成本常常藏在边界上 WebAssembly 的跨语言互操作让 Rust、C、C 等语言可以在浏览器或宿主环境中被 JavaScript 调用。但互操作并不是零成本。WASM 和宿主之间传递字符串、数组和复杂对象时&#xff…

作者头像 李华
网站建设 2026/7/2 1:50:16

Qt-摄像头捕获画面

在qt中捕获摄像头画面&#xff0c;在ui界面上添加一个comboBox控件、label标签和两个pushButton按钮&#xff0c;comboBox用于显示摄像头的设备&#xff0c;按钮用于开启摄像头和捕获当前帧的画面&#xff0c;label用于显示摄像头捕获的画面。//需要在.pro文件中加上multimedia…

作者头像 李华
网站建设 2026/7/2 1:48:15

聊聊跨域问题

跨域到底该谁管&#xff1f;浏览器、代理与 Gateway CORS适用&#xff1a;WeekFlow 前后端分离开发&#xff08;Vite Gateway Nginx&#xff09; 读者&#xff1a;前后端开发、运维1. 从一个报错说起 前端跑在 http://localhost:5173&#xff0c;Gateway 在 http://localhost…

作者头像 李华