#include<bits/stdc++.h>
using namespace std;
using i128 = __int128;
void put(i128 x) {
if(x == 0) {
cout << 0;
return;
}
if(x < 0) {
cout << '-';
x = -x;
}
string s;
while(x) {
s += char(x % 10 + '0');
x /= 10;
}
reverse(s.begin(), s.end());
cout << s;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long a, b;
cin >> a >> b;
i128 ans = (i128)a * b;
put(ans);
return 0;
}
如果输入:
1000000000000000000 1000000000
程序会输出:
1000000000000000000000000000
也就是:
1027
如果输入本身也可能超过 long long,就需要手写读入函数。
using i128 = __int128;
i128 read() {
string s;
cin >> s;
i128 x = 0;
int p = 0;
int f = 1;
if(s[0] == '-') {
f = -1;
p = 1;
}
for(int i = p; i < (int)s.size(); i++) {
x = x * 10 + s[i] - '0';
}
return x * f;
}
不过在大多数算法题里,通常只需要手写输出,不需要手写读入。
四、__int128 的常见使用场景
第一类场景是两个大数相乘。
比如:
a,b≤1018
如果要计算:
a×b
那么最大可能达到:
1036
这个结果一定会超过 long long。
即使最后要对某个数取模,中间乘法也可能先溢出。
例如:
long long a, b, mod;
cin >> a >> b >> mod;
long long ans = a * b % mod;