競技プログラミング用 知識集積所
int型
最終更新:
sport_programming
-
view
雑な説明
最も代表的な整数型変数。
レベル
ABCのA問題レベル。
使わない問題はほぼない。
使わない問題はほぼない。
詳細な説明
32ビットの整数型。
符号用の1ビット、値の大きさ用の31ビット。
そのため、扱える値の範囲は-2,147,483,648から2,147,483,647まで。
およそ±20億、±2×10^9くらいまでは大丈夫、それを超えると危ない、と認識するとよい。
符号用の1ビット、値の大きさ用の31ビット。
そのため、扱える値の範囲は-2,147,483,648から2,147,483,647まで。
およそ±20億、±2×10^9くらいまでは大丈夫、それを超えると危ない、と認識するとよい。
宣言と初期化
宣言だけする場合
int a;
初期化もする場合
int a = 0; //固定値で初期化 int b = a; //他の変数(整数型、double型)で初期化
可能な演算
代入 =
a=b; で、変数aの中身をbという値に書き換える。
数学とは違い、左右を逆にして b=a; と書くと意味が変わるので注意。
数学とは違い、左右を逆にして b=a; と書くと意味が変わるので注意。
加算 +
a+bで、aとbの和を計算する。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
減算 -
a-bで、aとbの差を計算する。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
乗算 *
a*bで、aとbの積を計算する。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
片方がlong long型だと答えもlong long型に、片方がdouble型だと答えもdouble型になる。
除算(切り捨て) /
a/bで、aをbで割ったときの商を計算する。
整数型同士の割り算は、商と余りを出す方式の割り算で行われる。
小数まで出して切り捨てしたと考えてもよい。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
整数型同士の割り算は、商と余りを出す方式の割り算で行われる。
小数まで出して切り捨てしたと考えてもよい。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
片方がlong long型だと答えもlong long型になる。
片方がdouble型だと、小数まで商を求めて答えもdouble型になる。
片方がdouble型だと、小数まで商を求めて答えもdouble型になる。
剰余 %
a%bで、aをbで割ったときの余りを計算する。
整数型同士の割り算は、商と余りを出す方式の割り算で行われる。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
整数型同士の割り算は、商と余りを出す方式の割り算で行われる。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
片方がlong long型だと答えもlong long型になる。
片方がdouble型だとエラーになる。
片方がdouble型だとエラーになる。
AND & (B問題レベル)
ビット演算(未作成)参照。
OR | (B問題レベル)
ビット演算(未作成)参照。
XOR ^ (B問題レベル)
ビット演算(未作成)参照。
NOT ~ (B問題レベル)
ビット演算(未作成)参照。
左シフト << (B問題レベル)
ビット演算(未作成)参照。
右シフト >> (B問題レベル)
ビット演算(未作成)参照。
各種複合代入演算子
複合代入演算子(未作成)を参照。
int型の場合、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、および、++、--、が使える。
int型の場合、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、および、++、--、が使える。
よく使う処理
除算(切り上げ)
a/bを小数以下切り上げで計算したい場合、以下のようにすればよい。
(a+b-1)/b
余りが1でもあるなら、b-1を足すことで商が1大きくなるという原理。
除算(四捨五入)
a/bを四捨五入で計算したい場合、以下のようにすればよい。
(2*a+b)/(2*b)
(2*a)/(2*b)と考えて、余りがb以上あれば、bを足すことで商が1大きくなるという原理。
倍数判定
if分岐の条件に「aがbの倍数であるなら」を書きたい場合、以下のようにする。
if (a%b==0)
bの倍数であることと、bで割った余りが0であることは同じである。
「aがbの倍数でないなら」の場合は、以下。
「aがbの倍数でないなら」の場合は、以下。
if (a%b!=0)
特に、「aが偶数であるなら」は
if (a%2==0)
「aが奇数であるなら」は
if (a%2)
と書ける。
後者は、int型の0以外の数はtrueとして扱われる仕様を利用しているが、自信がなければ
後者は、int型の0以外の数はtrueとして扱われる仕様を利用しているが、自信がなければ
if (a%2==1)
と明示的に書いてももちろんよい。
倍数化
aに近いbの倍数を探す場合、bで割ってからbを掛ければよい。
つまり、小さい方へ探すなら切り捨てを利用して
つまり、小さい方へ探すなら切り捨てを利用して
a/b*b
大きい方へ探すなら切り上げを利用して
(a+b-1)/b*b
どちらでもいいから近い方へ探すなら四捨五入を利用して
(2*a+b)/(2*b)*b
でaに最も近いbの倍数を求めることができる。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
負数の場合はC++の謎仕様が関わるので、下の方の注意点を参照。
char型化(B問題レベル)
ASCIIコード上で'0'から'9'までが連続で並んでいることを利用できる。
0以上9以下のint整数aがある場合に、その数字のchar型データを得たい場合、
0以上9以下のint整数aがある場合に、その数字のchar型データを得たい場合、
a+'0'
の結果をchar型変数に入れる。
逆に、char型の数字1文字cを実際の数にしたい場合、
逆に、char型の数字1文字cを実際の数にしたい場合、
c-'0'
とする。
文字列化(B問題レベル)
int型の数であるaを文字列型に変換したい場合、
to_string(a)
とすればいい。
逆に文字列型をint型にしたい場合、
逆に文字列型をint型にしたい場合、
stoi(s)
注意点
桁あふれに注意。
int型が扱える範囲は±20億くらいが限界。
10億以下の数2つの足し算ならセーフだが、3つ足すとアウトになる場合がある。
4万以下の数2つの掛け算ならセーフだが、3つ掛けるとアウトになる場合がある。
桁あふれしそうな場合にはlong long型を使うこと。
10億以下の数2つの足し算ならセーフだが、3つ足すとアウトになる場合がある。
4万以下の数2つの掛け算ならセーフだが、3つ掛けるとアウトになる場合がある。
桁あふれしそうな場合にはlong long型を使うこと。
負数の除算の商と余りの謎仕様に注意。
数学的には、-7を3で割ったら商が-3で余りが2である。
しかし、C++ではなぜか商が-2で余りが-1と計算される。
数学的な商と余りを出したい場合、「普通に求めて余りが負だったら商から1を引いて余りに割る数を加える」というコードを書き足す必要がある。
しかし、C++ではなぜか商が-2で余りが-1と計算される。
数学的な商と余りを出したい場合、「普通に求めて余りが負だったら商から1を引いて余りに割る数を加える」というコードを書き足す必要がある。
ビット演算の優先順位に注意。
ビット演算系は、計算の優先順位がかなりややこしい。
サボらずに括弧をつけて優先順位を明示するとバグりにくくなる。
サボらずに括弧をつけて優先順位を明示するとバグりにくくなる。
関連アルゴリズム
2つの整数、または3つ以上の整数の最大公約数を得る方法と、その活用。
2つの整数、または3つ以上の整数の最小公倍数を得る方法と、その活用。
n個のものをそれぞれ採用する・しないで2^n通りの全探索をしたい場合に、int型の性質を利用することができる。
十進法からk進法へ、k進法から十進法への変換。