C - abc285_brutmhyhiizp Editorial by rsk0315
簡単のため、A から Z の代わりに、一旦 1 から 9 のみを同様の規則で並べた ID を一旦考えます。左側がその ID で、右側がその ID が小さい方から何番目かを表します。
1 -> 1
2 -> 2
3 -> 3
...
9 -> 9
11 -> 10
12 -> 11
...
19 -> 18
21 -> 19
22 -> 20
...
91 -> 82
92 -> 83
...
99 -> 90
111 -> 91
...
これを見ると、「各桁が 1, 2, …, 9 であるような 9 進法」かのように解釈して、「各桁が 0, 1, …, 9 の(通常の)10 進法」に直す操作に対応することがわかります。
たとえば、“92” → 83 への変換は \(9\cdot 9^1 + 2\cdot 9^0 = 83\) で、“111” → 91 への変換は \(1\cdot 9^2 + 1\cdot 9^1 + 1\cdot 9^0 = 91\) のような感じです。
これを踏まえると、元々の問題は「各桁が 1 (=A), 2 (=B), …, 26 (=Z) であるような 26 進法」を通常の 10 進法に直す操作となり、以下のような実装で済むとわかります。
#include <iostream>
#include <string>
int main() {
std::string s;
std::cin >> s;
long res = 0;
for (auto c: s) {
res *= 26;
res += c - '@';
}
std::cout << res << '\n';
}
(C++ での文字コードは処理系定義ですが、ASCII においては)'@' == 'A' - 1
なので、よくある c - 'A' + 1
の代わりに c - '@'
と書くこともできます。
posted:
last update: