wloving

wloving

算法学习
bilibili

比long long更大的__int128

説明#

__int128は 64 ビットの GCC、G++ でのみサポートされており、C++ の標準ではありません。64 ビットの GCC の場合は直接使用できます。

NOI シリーズイベントでのプログラミング言語の使用制限に関する補足説明では次のように述べられています:

アンダースコアで始まるライブラリ関数やマクロの使用は許可されますが、明示的に禁止されているライブラリ関数やマクロは除外されます。

したがって、__int128は競技中に使用することができます。

ストレージ範囲#

__int128は 128 バイトのスペースを占有し、データ範囲は
212721271-2^{127}\sim 2^{127}-1 です。

正確な範囲は 170141183460469231731687303715884105728170141183460469231731687303715884105727-170141183460469231731687303715884105728 \sim 170141183460469231731687303715884105727 で、桁数は約1×10381\times 10^{38}です。

使用方法#

宣言と定義#

他の型と同様に 型名 変数名 とします。

__int128 a=4,b=3;
a=10;
a+=b;
a*=b;
...

入力と出力#

C++ の標準ではないため、対応する入出力ツールがなく、scanfprintfcincoutを直接使用することはできません。入力と出力は自分で手動で行う必要があります。

入力#

void read(__int128 &ans){
    __int128 x,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    ans=x*f;
}

出力#

void output(__int128 x){
	if(x<0){
		putchar('-');
		x*=-1;
	}
	int ans[35]={0},top=0;
	do{
		ans[top++]=x%10;
		x/=10;
	}while(x);
	while(top){
		putchar(ans[--top]+'0');
	}
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。