#include <iostream>
#include <string>
#include <algorithm> // std::reverse(), std::replace()
// 8 進法から 10 進法への変換
long long FromBase8(const std::string& s)
{
long long n = 0;
for (auto c : s)
{
n *= 8;
n += (c - '0');
}
return n;
}
// 10 進法から 9 進法への変換
std::string ToBase9(long long n)
{
// 0 のとき空の文字列を返さないように
if (n == 0)
{
return "0";
}
std::string s;
while (n)
{
const char c = '0' + (n % 9);
s.push_back(c);
n /= 9;
}
// 低い桁から .push_back() していたので反転する
// 例: "54321" -> "12345"
std::reverse(s.begin(), s.end());
return s;
}
int main()
{
// 8 進法の整数 N
std::string N;
std::cin >> N;
// K 回の操作
int K;
std::cin >> K;
for (int i = 0; i < K; ++i)
{
N = ToBase9(FromBase8(N));
// 文字列中の '8' を '5' に置き換える
// 例: "18588" -> "15555"
std::replace(N.begin(), N.end(), '8', '5');
}
// 解答を出力
std::cout << N << '\n';
}
C++ 標準ライブラリの std::stoll()
と std::to_chars()
を使うと、短いコードで解答できます。
#include <iostream>
#include <string> // std::stoll()
#include <charconv> // std::to_chars()
#include <algorithm> // std::replace()
int main()
{
// 8 進法の整数 N
std::string N;
std::cin >> N;
// K 回の操作
int K;
std::cin >> K;
// 9 進数を格納するのに十分なバッファ
char base9[32]{};
for (int i = 0; i < K; ++i)
{
// 8 進数を 10 進数に
const long long base10 = std::stoll(N, nullptr, 8);
// 10 進数を 9 進数に
N.assign(base9, std::to_chars(std::begin(base9), std::end(base9), base10, 9).ptr);
// 文字列中の '8' を '5' に置き換える
// 例: "18588" -> "15555"
std::replace(N.begin(), N.end(), '8', '5');
}
// 解答を出力
std::cout << N << '\n';
}