最近羣友對int128這個東西討論的熱火朝天的。講道理的話,編譯器的gcc是不支持__int128這種數據類型的,好比在codeblocks 16.01/Dev C++是沒法編譯的,可是提交到大部分OJ上是能夠編譯且能用的。C/C++標準。IO是不認識__int128這種數據類型的,所以要本身實現IO,其餘的運算,與int沒有什麼不一樣。ios
可是官方上寫了GCC提供了兩種128位整數類型,分別是__int128_t和__uint128_t,分別用於聲明有符號整數變量和無符號整數變量。c++
有關GCC的文檔參見:Using the GNU Compiler Collection (GCC)。git
這裏給出了樣例程序,是有關類型__int128_t和__uint128_t的。從計算能夠看出,這兩個類型都是16字節的,類型__uint128_t是128位的。程序中使用了按位取反運算,移位運算和乘法運算。github
因爲這種大整數沒法使用函數printf()輸出其值,因此本身作了一個整數轉字符串函數myitoa(),用於實現128位整數的輸出。函數
有興趣的同窗想了解底層實現原理能夠參看個人Github上:https://github.com/AngelKitty/English-Version-CHSInt128測試
代碼實現以下:ui
1 #include <iostream> 2 3 using namespace std; 4 5 void myitoa(__int128_t v, char* s) 6 { 7 char temp; 8 int i=0, j; 9 10 while(v >0) { 11 s[i++] = v % 10 + '0'; 12 v /= 10; 13 } 14 s[i] = '\0'; 15 16 j=0; 17 i--; 18 while(j < i) { 19 temp = s[j]; 20 s[j] = s[i]; 21 s[i] = temp; 22 j++; 23 i--; 24 } 25 } 26 27 int main() 28 { 29 __uint128_t n = 0; 30 31 n = ~n; 32 int count = 0; 33 while(n > 0) { 34 count++; 35 n >>= 1; 36 } 37 38 cout << "count=" << count << endl; 39 cout << "__uint128_t size=" << sizeof(__uint128_t) << endl; 40 cout << endl; 41 42 cout << "__int128_t size=" << sizeof(__int128_t) << endl; 43 44 __int128_t x = 1100000000000000L; 45 __int128_t y = 2200000000000000L; 46 char s[40]; 47 48 x *= y; 49 50 myitoa(x, s); 51 52 cout << "x=" << s << endl; 53 54 return 0; 55 }
打印結果以下:spa
count=128 __uint128_t size=16 __int128_t size=16 x=2420000000000000000000000000000
如下是__int128的OJ簡單應用,寫題必備神器。code
a+b大數讀入模板:blog
1 #include <bits/stdc++.h> 2 using namespace std; 3 inline __int128 read() 4 { 5 __int128 x=0,f=1; 6 char ch=getchar(); 7 while(ch<'0'||ch>'9') 8 { 9 if(ch=='-') 10 f=-1; 11 ch=getchar(); 12 } 13 while(ch>='0'&&ch<='9') 14 { 15 x=x*10+ch-'0'; 16 ch=getchar(); 17 } 18 return x*f; 19 } 20 21 inline void write(__int128 x) 22 { 23 if(x<0) 24 { 25 putchar('-'); 26 x=-x; 27 } 28 if(x>9) 29 write(x/10); 30 putchar(x%10+'0'); 31 } 32 33 int main() 34 { 35 __int128 a = read(); 36 __int128 b = read(); 37 write(a + b); 38 return 0; 39 }
測試了一下,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