最近群友对int128这个东西讨论的热火朝天的。讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准。IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同。
但是官方上写了GCC提供了两种128位整数类型,分别是__int128_t和__uint128_t,分别用于声明有符号整数变量和无符号整数变量。
有关GCC的文档参见:Using the GNU Compiler Collection (GCC)。
这里给出了样例程序,是有关类型__int128_t和__uint128_t的。从计算可以看出,这两个类型都是16字节的,类型__uint128_t是128位的。程序中使用了按位取反运算,移位运算和乘法运算。
由于这种大整数无法使用函数printf()输出其值,所以自己做了一个整数转字符串函数myitoa(),用于实现128位整数的输出。
有兴趣的同学想了解底层实现原理可以参看我的Github上:https://github.com/AngelKitty/English-Version-CHSInt128
代码实现如下:
#include <iostream> using namespace std; void myitoa(__int128_t v, char* s)
{
char temp;
int i=, j; while(v >) {
s[i++] = v % + '';
v /= ;
}
s[i] = '\0'; j=;
i--;
while(j < i) {
temp = s[j];
s[j] = s[i];
s[i] = temp;
j++;
i--;
}
} int main()
{
__uint128_t n = ; n = ~n;
int count = ;
while(n > ) {
count++;
n >>= ;
} cout << "count=" << count << endl;
cout << "__uint128_t size=" << sizeof(__uint128_t) << endl;
cout << endl; cout << "__int128_t size=" << sizeof(__int128_t) << endl; __int128_t x = 1100000000000000L;
__int128_t y = 2200000000000000L;
char s[]; x *= y; myitoa(x, s); cout << "x=" << s << endl; return ;
}
打印结果如下:
count=
__uint128_t size= __int128_t size=
x=
以下是__int128的OJ简单应用,写题必备神器。
a+b大数读入模板:
#include <bits/stdc++.h>
using namespace std;
inline __int128 read()
{
__int128 x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
} inline void write(__int128 x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
write(x/);
putchar(x%+'');
} int main()
{
__int128 a = read();
__int128 b = read();
write(a + b);
return ;
}
测试了一下,OJ提交没问题~~~
另外关于C/C++大数类,这里还给您提供了一个好的实现机制,源码我已经上传,下载链接在这里:https://files.cnblogs.com/files/ECJTUACM-873284962/bigint-10-2-src.7z
运行结果可以看到如下所示:
C++ BigInt class that enables the user to work with arbitrary precision integers.
Latest Version: 10.2