AtCoder が提供しているABC(AtCoder Beginner Contest)326 のB問題をC++とPythonで解いてみました。ABC326は、2023年10月28日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 326-like Numbers(Difficulty : 42)
問題はリンク先をご覧ください。
3桁の整数から各桁の数を取り出し条件を満たすか確認します。AtCoder Problems による Difficulty は、42 でした。
解答案
与えられた整数 $N$ から、それぞれの桁の数字を計算する必要があります。以下の2つの方法を紹介します。制約から $N$ は、3桁の整数となります。
- それぞれの桁の数字を計算で求める。
- 文字列として処理する。
C++ プログラム例(ABC326B)
それぞれの桁の数字を計算します。
- 100の桁は、100で割った値
- 10の桁は、100で割った余りを10で割った値
- 1の桁は、10で割った余り
100の桁の数と10の桁の数の積が1の桁の数と等しくなるまで、n を増やしていきます。以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (true) {
int n100 = n / 100;
int n10 = (n % 100) / 10;
int n1 = n % 10;
if (n100 * n10 == n1) {
cout << n << endl;
break;
}
++n;
}
return 0;
}
文字列として取り扱うプログラムも紹介します。関数 to_string で整数を文字列に変換します。それぞれの桁の数字は、文字列の文字から ‘0’ を引いた値となります。
以下が文字列として計算したプログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (true) {
string s = to_string(n);
int n100 = s[0] - '0';
int n10 = s[1] - '0';
int n1 = s[2] - '0';
if (n100 * n10 == n1) {
cout << n << endl;
break;
}
++n;
}
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC326B)
先にそれぞれの桁の数字を計算するバージョンを紹介します。基本的な考え方は C++ と同じです。以下となります。
"""AtCoder Beginner Contest 326 B"""
n = int(input())
while True:
n100 = n // 100
n10 = (n % 100) // 10
n1 = n % 10
if n100 * n10 == n1:
print(n)
break
n += 1
文字列として計算するバージョンも紹介します。
"""AtCoder Beginner Contest 326 B"""
n = int(input())
while True:
s = str(n)
n100 = int(s[0])
n10 = int(s[1])
n1 = int(s[2])
if n100 * n10 == n1:
print(n)
break
n += 1
こちらも「AC」と判定されました。
最後に
今回の問題は制約から3桁でしたが、桁数が多い整数に対して、なにか処理をする場合は、文字列で処理した方が楽かもしれません。例えば ABC304B問題(解説記事)などが該当します。
引き続き ABC の問題を紹介していきます。