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問題は、逆の問題となります。
引き続き ABC の問題を紹介していきます。