問題
問題文
AtCoDeer君は、赤、緑、青色のカードを持っています。
それぞれのカードには $1$ 以上 $9$ 以下の整数が書かれており、赤色のカードには $r$、緑色のカードには $g$、青色のカードには $b$ が書かれています。
$3$ つのカードを左から順に赤、緑、青色の順に並べ、左から整数を読んだときにこれが $4$ の倍数であるか判定しなさい。
制約
$1 \le r,~g,~b \le 9$
収録されている問題セット
回答
回答1 (AC)
赤、緑、青のカードの値を取り込ん3桁の整数を求め、それが4の倍数になっているか、つまり4で割り切れるかを判定すれば良いでしょう。ここで、百の位が $r$, 十の位が $g$、一の位が $b$ である3桁の整数は $100r+10g+b$ と表せることを利用して、以下のようにコーディングしました。無事、ACでした。
#include <bits/stdc++.h>
using namespace std;
int main() {
int r, g, b;
cin >> r >> g >> b;
if ( (100*r+10*g+b)%4==0 ) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
回答2 (AC)
回答1でACになりますが、ちょっとだけ改良が可能です。ある整数が4の倍数であるかを判定するには、下2桁が4の倍数かを判定すれば良いことが知られています。これは、3桁目以上の部分は100の倍数、つまり4の倍数であるため、下2桁が4の倍数かを判定することで、整数全体が4の倍数であるかを判定することができるのです。従ってこの問題の場合、十の位が $g$、一の位が $b$ である2桁の整数が4の倍数であるかを判定すれば良いでしょう。コードは以下のようになりました。本来なら変数 $r$ は不要なのですが、何となく残してしまいました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int r, g, b;
cin >> r >> g >> b;
if ( (10*g+b)%4==0 ) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
調べたこと
AtCoderの解説 → コンテスト全体の解説
回答1と同じ解法でした。
学んだこと
倍数の判定法
- 2の倍数:下1桁が2の倍数(偶数)ならば整数全体も2の倍数
- 3の倍数:各桁の数字の和が3の倍数ならば整数全体も3の倍数
- 4の倍数:下2桁が4の倍数ならば整数全体も4の倍数
- 5の倍数:下1桁が5の倍数ならば(0 or 5)整数全体も5の倍数
- 6の倍数:整数が2の倍数かつ3の倍数ならば整数全体は6の倍数
- 8の倍数:下3桁が8の倍数ならば整数全体も8の倍数
- 9の倍数:各桁の数字の和が9の倍数ならば整数全体も9の倍数
リンク
前後の記事
- 前の記事 → AtCoderログ:0002 - ABC 086 A
- 次の記事 → AtCoderログ:0004 - ABC 088 A