第10回【Python】10 進数から 2 進数に変換、10 進数から M 進数に変換

現在取り組んでいるのは、paiza ラーニング問題集「ループメニュー 2」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 10 回目です。

10 回続けてもキャラは定まりません。しかし、Python の内包表記がサラサラと書けるくらいには成長してきた実感のある LeoSaki(旦那)です。ここでのキャラについては、もういっそ素のままでいいんじゃないかと思うのですが、そもそも、素で書いているような気がするので、あまり深く考えないことにします。

それでは、今日も頑張ってみようと思います。

10 進数から 2 進数に変換

10 進数で表された整数 N が与えられます。
N を 2 進数に変換して出力してください。

基本情報とか応用情報とかの問題でたくさん解いたぞ、2 進数。LeoSaki(旦那)は、小学生の頃だったか中学生の頃だったかに習った記憶があるんだが、今は学校では習わないのだとか。インフラやってると絶対必要だし、これだけコンピューターが普及しているのに、なんで学習指導要領から削除したんだろう、謎。

Python
N = int(input())
ans = []
while N > 0:
    ans.append(N % 2)
    N //= 2
print(*ans[::-1],sep="")

少し強引すぎますかね? 2 で割った余りを上から順に並べていくのが解法だったと思うのだけれど。
リストに追加したり、リストを逆から並べたりって、速度的にどうなんだろう。単純に計算を重ねた方が実行速度が速いとかあるのだろうか。

解答が string 型だから、これを受け渡した場合、次のコードで問題が発生するかもしれない。まぁ、問題で string 型じゃダメと書かれていないのだから良しとしよう。

関数を利用した別解。最初はこれを書いた。

Python
N = int(input())
print(bin(N)[2:])

VBA で使うことねぇだろ、と思ったんだけど、VBA で 2 進数変換はしたことがある。何かの案件でサブネットマスクの確認をするのに、自作の自動計算器を作ったんだ。

VBA
N = Cells(1, 1)
ans = ""
Do While N > 0
    ans = N Mod 2 & ans
    N = Int(N / 2)
Loop
Debug.Print ans

やっていることは同じだけど、直接上位桁に追加するのは VBA っぽいと思わないか?

10 進数から M 進数に変換

10 進数で表された整数 N, M が与えられます。
N を M 進数に変換して出力してください。

2 で割るという作業を M で割る作業にすれば良いだけ。

Python
N,M = map(int,input().split())
ans = []
while N > 0:
    ans.append(N % M)
    N //= M
print(*ans[::-1],sep="")

paiza の問題集ってよくできているなぁと思うのが、関数を使ったやり方(bin(N)[2:])しか知らないままだと、応用力に欠ける。それを補うことができる。

VBA でも同じかな。
セル A1 に N,M が入力されています。

VBA
A = Split(Cells(1, 1), " ")
N = A(0)
M = A(1)
ans = ""
Do While N > 0
    ans = N Mod M & ans
    N = Int(N / M)
Loop
Debug.Print ans

最後に

知らないとダメ、問題だけれど、IT 業界に足を突っ込んだ以上、知っておいた方がいい、問題なんだと思った。Webアプリとかだと、なかなか N 進法の計算なんて考えないと思うけれど。インフラは、考えることあります。ただ、世の中には、簡単に計算してくれるサービス、ソフトが溢れているので、わざわざ自作する人は・・・誰か? LeoSaki(旦那)です。暇人ではないの。自分の手元ですぐに計算できるものが欲しかっただけで。

10 回続いたので、次は 20 回を目指して、頑張ろうと思う。

引き続き、お付き合いよろしくお願いいたします!

PythonPython,paiza,学習

Posted by LeoSaki