Skip to content

Latest commit

 

History

History
111 lines (87 loc) · 1.95 KB

067.md

File metadata and controls

111 lines (87 loc) · 1.95 KB

067 - Base 8 to 9 (★2)

解答 1

#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';
}

解答 2 (std::stoll()std::to_chars() を使う)

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';
}