简述
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一样,相信各位都会