AtCoder

ABC285 C問題(abc285_brutmhyhiizp)を解く

AtCoder_ABC285_C

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

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

C問題 abc285_brutmhyhiizp(Difficulty : 157)

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

ABC285 C問題 abc285_brutmhyhiizp

26進数として解釈して値を求める問題です。AtCoder Problems による Difficulty は 157 でした。

解答案

A は 1、B は 2、…、Z は 26、AA は 27 と計算できます。26進数と考えることができます。Excel の列で見た人がいるかもしれません。注意は以下の2点です。

  • 数字 0 に該当する文字がない。数字は 1 から始まる。
    ※通常 K 進数は、0 から K-1 までの数字を使う。
  • 1、2、3 ではなく、A、B、C を使う。

K 進数(K = 2, …, 9)文字列をに10進数に変換する関数 Kto10 は以下となります。この関数をベースとします。

ull Kto10(string s, int k) {
	ull result = 0;

	for (int i = 0; i < s.length(); ++i) {
		result = result * k + (s[i] - '0');
	}

	return result;
}

C++ プログラム例(ABC285C)

上で紹介した関数 Kto10 を修正して26進数文字列を10進数に変換する関数として使います。main で文字列を読み込み、関数 Kto10 で変換した数を表示します。

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long int ull;

ull Kto10(string s) {
	ull result = 0;

	for (int i = 0; i < s.length(); ++i) {
		result = result * 26 + (s[i] - 'A' + 1);
	}

	return result;
}

int main()
{
	string s;
	cin >> s;

	cout << Kto10(s) << endl;

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC285)

Python 版も、C++ のプログラムをそのまま移植しました。

"""AtCoder Beginner Contest 285 C"""


def Kto10(s):
    result = 0
    for _, ch in enumerate(s):
        result = result * 26 + (ord(ch) - ord('A') + 1)
    return result


s = input()
print(Kto10(s))

こちらも AC(Accepted=正しいプログラム)と判定されました。

最後に

プログラムでは10進数以外では、2進数と16進数がよく使われます。今回は、26進数として考えると上手く解くことができました。

参考までに、ABC171C問題は、逆の問題となります。

ABC285 について、引き続き、D問題まで紹介します。

COMMENT

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

CAPTCHA