AtCoder

ABC326 B問題(326-like Numbers)を解く

AtCoder_ABC326_B

AtCoder が提供しているABC(AtCoder Beginner Contest)326 のB問題をC++とPythonで解いてみました。ABC326は、2023年10月28日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 326-like Numbers(Difficulty : 42)

問題はリンク先をご覧ください。

ABC326 B問題 326-like Numbers

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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA