- 李奕樊 的博客
int_128 介绍及应用
- 2023-10-3 20:09:06 @
__int128介绍
__int128 就是占用128字节的整数存储类型。由于是二进制,范围就是 ~ ,如果使用了 unsigned ___int128,则范围变成 ~ ,即约39位数,这在一定程度上可以替代高精度运算实现大数运算,而且操作难度更低,所以在数据范围不超过的情况下,都可以使用__int128。
我在对比 _int128 与 高精度的十组题目, 发现_int128比高精度短得多, 蛋试, 由于 __int128 仅仅是 编译器,不在C++98/03/11/14/17/20 标准内,且仅 GCC4.6 以上64位版本支持,很多配套都没有,只有四则运算功能 除了要自己写输入输出。使用方法与 int long long 无异:
使用__int128方法
我建议大家在使用__int128时将其重命名为 或 , 这里用 演示
#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');
}
试例
#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;
}