前言

如果遇到 long long 开不下的情况,可以使用 __int128 来博一把!

note__int128 仅 \(64\) 位 \(GCC G++\) 支持,不在 \(C++\) 标准中!不在 namespace std 中!

\(64\) 位 \(GCC\) 可直接使用。

存储范围

顾名思义, __int128 就是占用128字节的整数存储类型。由于是二进制,范围就是 \(-2^{127}\) ~ \(2^{127}-1\),如果使用了 unsigned __int128,则范围变成 \(0\) ~ \(2^{128}\),即约39位数!

经作者实测,这样 __int128 的精确范围是

\(-170141183460469231731687303715884105728\) ~ \(170141183460469231731687303715884105727\)

unsigned __int128 的精确范围则是 \(0\) ~ \(340282366920938463463374607431768211455\)

使用方法

由于 __int128 仅仅是 \(GCC\) 编译器内的东西,不在 \(C++ 98/03/11/14/17/20\) 标准内,且仅 \(GCC4.6\) 以上64位版本支持,很多配套都没有,只有四则运算功能 所以要自己写输入输出。使用方法与 int long long 无异:

  1. __int128 a=9,b=27;
  2. a=10;
  3. a+=b;
  4. a*=b;
  5. ... ...

输入输出

由于不在 \(C++\) 标准内,没有配套的 printf scanf cin cout 输入输出,只能手写。

方法一:(对于 cin cout ):

思路:写一个类(更推荐结构体),实现快读(换一下数据),写一个返回值,将读入过程转换成一个函数。

note :此种方法用的还是 \(C\) 的输入输出!切记不要把它和 istream ostream 混为一谈!

如果程序中关闭了同步(ios::sync_with_stdio(0);)造成输入输出混乱,后果自负!

  1. namespace fastio{
  2. struct reader{
  3. template<typename T>Reader&operator>>(T&x){
  4. char c=getchar();short f=1;
  5. while(c<'0'||c>'9'){if(c=='-')f*=-1;c=getchar();}
  6. x=0;while(c>='0'&&c<='9'){
  7. x=(x<<1)+(x<<3)+(c^48);
  8. c=getchar();
  9. }x*=f;return *this;
  10. }
  11. }cin;
  12. struct writer{
  13. template<typename T>Writer&operator<<(T x){
  14. if(x==0)return putchar('0'),*this;
  15. if(x<0)putchar('-'),x=-x;
  16. static int sta[45];int top=0;
  17. while(x)sta[++top]=x%10,x/=10;
  18. while(top)putchar(sta[top]+'0'),--top;
  19. return*this;
  20. }
  21. }cout;
  22. };
  23. #define cin fastio::cin
  24. #define cout fastio::cout

在程序的最上面(头文件下第一行,using namespace std前)加入此代码,就可以使用 cin cout 输入输出 __int128 啦!

note :这是自己写的 cin cout ,用std::cin std::cout不可以的


方法二:快读、快写板子:

其实就是把快读、快写的数据类型改了一下(偷懒)

  1. #define int __int128
  2. inline void read(int &n){
  3. int x=0,f=1;
  4. char ch=getchar();
  5. while(ch<'0'||ch>'9'){
  6. if(ch=='-') f=-1;
  7. ch=getchar();
  8. }
  9. while(ch>='0'&&ch<='9'){
  10. x=(x<<1)+(x<<3)+(ch^48);
  11. ch=getchar();
  12. }
  13. n=x*f;
  14. }
  15. inline void print(int n){
  16. if(n<0){
  17. putchar('-');
  18. n*=-1;
  19. }
  20. if(n>9) print(n/10);
  21. putchar(n % 10 + '0');
  22. }
  23. #undef int

至于 printf scanf \(……\) \(hmm\) \(……\) 那是 \(C\) 的函数,除非你再写一个?


配套函数

如果你想赋一个 \({巨大无比}\) 的初值,最大只能赋值成 long long 最大值。想要 \(1000000000000000000000000000000000000000\) 这样的数只能用字符串:

  1. inline __int128 to_int128(string s){
  2. int l=s.length();
  3. __int128 m=0;
  4. for(int i=0;i<l;i++){
  5. m*=10;
  6. m+=s[i]-48;
  7. }
  8. return m;
  9. }

END.

2021/12/31

upd on 2022/1/19

添加 cin cout 输出


另祝:Happy New Year! (In my \(luogu\) \(blog\)

虽然新年过了,春节不是还没到嘛?

详解__int128的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. CF111A Petya and Inequiations 题解

    Content 请找出一个由 \(n\) 个正整数组成的数列 \(\{a_1,a_2,\dots,a_n\}\),满足以下两种条件: \(\sum\limits_{i=1}^na_i^2\geqsla ...

  2. k8s daemonset controller源码分析

    daemonset controller分析 daemonset controller简介 daemonset controller是kube-controller-manager组件中众多控制器中的 ...

  3. HTTPS握手-混合加解密过程

    SSL协议通信过程 (1) 浏览器发送一个连接请求给服务器;服务器将自己的证书(包含服务器公钥S_PuKey).对称加密算法种类及其他相关信息返回客户端; (2) 客户端浏览器检查服务器传送到CA证书 ...

  4. DG修复:异常关库导致的数据库启动失败ORA-01110及GAP修复

    问题描述:正在应用的备库是一套11.2.0.4的rac环境,但是被直接crsctl stop cluster集群强制关库,重新启动之后导致数据库启动失败,报错 Errors in file /u01/ ...

  5. JAVA判断是否是Ajax请求

    /** * 是否是Ajax异步请求 * * @param request */ public static boolean isAjaxRequest(HttpServletRequest reque ...

  6. JAVA中BufferedImage与byte[]转换

    BufferedImage转byte[] ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imgBuff, ...

  7. 【LeetCode】459. Repeated Substring Pattern 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历子串 日期 [LeetCode] 题目地址:ht ...

  8. 【LeetCode】991. Broken Calculator 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 【LeetCode】593. Valid Square 解题报告(Python)

    [LeetCode]593. Valid Square 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地 ...

  10. codeforce-600C. Make Palindrome(贪心)

    http://codeforces.com/problemset/problem/600/C: 题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母. ...