この処理は今後めっちゃ頻出なので、スラスラ書けるようになっておきたい!
問題概要
正の整数 が与えられる。
に最も近い 5 の倍数を求めよ。
解法
たとえば としてみよう。5 の倍数は
0, 5, 10, 15, 20, 25, 30, 35, 40, ...
と続いていくけど、これらのうち 23 を挟む「20」と「25」だけを考えれば良いことは明白だ。この場合、
- 20 と 23 の差は 3
- 25 と 23 の差は 2
であり、後者の方が小さいので答えは 25 となるわけだ。
一般の場合
問題なのは、与えられた整数 に対して、「 の前の 5 の倍数」 (23 に対する 20) と「 の後ろの 5 の倍数」(23 に対する 25) をどのように求めるかだ。
これは頻出なのでぜひとも押さえておきたい。 を 5 で割ってみればよいのだ。たとえば、 のとき
23 ÷ 5 = 4 あまり 3
となる。このとき、5 × 4 = 20 が「23 の前の 5 の倍数」となっている。そして、それに 5 を足した 25 が、「23 の後ろの 5 の倍数」になっている。
よって、一般に
- の前の 5 の倍数:
N / 5 * 5
で求められる - の後ろの 5 の倍数:それに 5 を足して求められる
ということがわかった。あとは、これらを比べれば良い。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; // N 以下の最大の 5 の倍数を求める int ika = N / 5 * 5; // N より大きい最小の 5 の倍数を求める int ue = ika + 5; // ika と ue のうち、N に近い方を答える int diff_ika = abs(ika - N); int diff_ue = abs(ue - N); if (diff_ika < diff_ue) cout << ika << endl; else cout << ue << endl; }