__int128使用详解和整形输入输出的优化(比scanf和printf快)

__int128使用详解和整形O/I操作的优化

简述

int:所占空间为32bit,也可以写作__int32(不过没见过谁这么写)
long long同理,占空间64bit,可写作__int64
__int128也一样,不过仅64位GCC,G++支持,且不在C++标准中。如果是64位GCC可直接使用,所以建议oi选手们弄一个linux虚拟机,考试能用(考场要是能确定不会出现负数的话在定义时像这样写__uint128_t,这是定义无符号型,长度翻倍,不过存不了负数了)

所以,不想背高精度的用这个抢分是不错的选择

注:有俩下划线

读入和输出(即优化)

__int128无法使用cin、scanf读入,也无法使用cout、printf输出,所以我们要自己写一个函数读入和输出

读入

先理解,再背

__int128 inline read() {/*inline是定义内联函数,加快调用速度,不过O2时无脑加会起反作用
(代码厌氧的一个原因)*/
	int sum = 0, fl = 1;
    char ch;
    ch = getchar();
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') fl = -1;/*isdigit意为判断是否为一个
十进制整数,是为真(true),否为假(false),在c++判断中非零即为真(true),所以在判断中加!意为
非十进制整数时运行*/
    for(; isdigit(ch); ch = getchar()) sum = sum*10-'0';/*getchar很快,用它来读,单引号内为
ASCII编码,是数字,减去零即求当前数字*/
    return sum * fl;//加上正负号
}

这就成了,用法:a = read();
这个函数使用getchar读入,所以很快,比scanf快不少,不够不建议无脑用,因为scanf的指定格式读入它做不到

再仔细看,这个函数是int128类型的,快是快,难道用int或long long的时候再改?(倒也不是不行)

于是我们声明 template 类,要求提供输入的类型T,并以此类型定义内联函数 read()

template <typename T> inline T read(){
    T sum = 0, fl = 1;
    char ch;
    ch = getchar();
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') fl = -1;
    for(; isdigit(ch); ch = getchar()) sum = sum*10-'0';
    return sum * fl;
}

跟上边一个原理,不加注释了,附上用法:a = read<>()
<>里填类型,int,long long int,__int128都行

什么?你问我浮点数?它当然读不了了,倒是能加,但你要知道__int128也是整形变量,加了也没用

输出

template <typename T> inline T write(T x){//还要写T是因为x不确定
    static int sta[45];//定义一个局部静态数组,存储数位,用int是因为每个下标上只存一个数,用于模拟栈
    int cnt = 0;//定义一个变量,用作索引,用int理由同上
    do{
        sta[cnt++] = x%10, x/= 10;//用去尾巴法把目标数每一位所对应的数都丢进栈里
    }while(x);//x没了,不存了
    while(cnt) putchar(sta[--cnt] + '0');//倒序输出,因为sta为栈,即为正序
    return NULL;//都输出完数了,还返回个der,NULL就完了
}

附用法:write<int>(a);
<>里填类型,int,long long int,__int128都行

使用

跟int,long long int一样,相信各位都会

参考文献

oi-wike

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TG_Sen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值