【競プロ典型90問】「067 - Base 8 to 9(★2) 」解法
Free-PhotosによるPixabayからの画像

このシリーズではE869120さんによって作成された競プロ典型90問をPythonで解いています。

問題

067 - Base 8 to 9(★2)

ポイント

問題文の通りに作業するだけです。

8進数から一気に9進数にするのが少々めんどいので、8進数→10進数、10進数→9進数に操作を分けています。

コード

def main():
    import sys
    sys.setrecursionlimit(10 ** 9)
    input = sys.stdin.readline

    N, K = map(str, input().split(" "))

    def basen_to_10(num_n, n):  # n進数→10進数に変換
        if num_n == 0:
            return 0
        num_10 = 0
        for s in str(num_n):
            num_10 *= n
            num_10 += int(s)
        return num_10

    def base10_to_n(num_10, n):  # 10進数→n進数に変換
        if num_10 == 0:
            return 0
        str_n = ''
        while num_10:
            if num_10 % n >= 10:
                return -1
            str_n += str(num_10 % n)
            num_10 //= n
        return int(str_n[::-1])

    K = int(K[:-1])  # K[:-1]としているのは私がinput関数をsys.stdin.readlineで置き換えて使用しているため。通常はKでOKです。
    for _ in range(K):
        N = basen_to_10(N, 8)  # 8進数→10進数に変換
        N = base10_to_n(N, 9)  # 10進数→9進数に変換
        N = int(str(N).replace('8', '5'))  # 8を5に変換

    print(N)


if __name__ == '__main__':
    main()

おすすめの記事