__int128介绍

__int128 就是占用128字节的整数存储类型。由于是二进制,范围就是 2127-2^{127} ~ 212712^{127-1},如果使用了 unsigned ___int128,则范围变成 0 0 ~ 21282^{128},即约39位数,这在一定程度上可以替代高精度运算实现大数运算,而且操作难度更低,所以在数据范围不超过的情况下,都可以使用__int128。

我在对比 _int128 与 高精度的十组题目, 发现_int128比高精度短得多, 蛋试, 由于 __int128 仅仅是 GCC GCC 编译器,不在C++98/03/11/14/17/20 标准内,且仅 GCC4.6 以上64位版本支持,很多配套都没有,只有四则运算功能 除了要自己写输入输出。使用方法与 int long long 无异:

使用__int128方法

我建议大家在使用__int128时将其重命名为 llllllbigIntbigInt, 这里用 bigIntbigInt演示

#define bigInt __uint128_t

typedef __uint128_t bigInt;

输入函数

bigInt in(){
	//直接在函数里面实现读字符串操作更简洁
	char input[1005];
	scanf("%s",input);   
    bigInt res=0, len = strlen(input);//初始结果赋值0
	for(int i=0;i<len;i++)
		res*=10,res+=input[i]-'0';//实现进位
	return res;//返回__int128类型
}

输出函数

void out(bigInt num){//递归调用,实现从高位向低位输出
	if(num>9) 
		out(num/10);
	putchar(num%10+'0');
}

试例

K 幂的计算

#include<bits/stdc++.h>
#define bigInt __uint128_t

using namespace std;

bigInt power(bigInt f, bigInt f1){
    bigInt ret = 1;
    for (int i = 1; i <= f1; i++){
        ret = 1LL * ret * f;
    }
    return ret;
}

void out(bigInt x){ //int128输出要自己写
	if (x > 9) {
		out(x/10);
	}
	putchar(x%10+48);
}

int main(){
    int n;
    bigInt sum = 0;
    scanf("%d", &n);
    while (n--){
        long long f;
        scanf("%lld", &f);
        string s = to_string(f);
        bigInt f1 = s[s.size()-1] - '0';
        sum += power(f / 10, f1);
    }
    out(sum);
    return 0;
}

完美 WA AC