メむンコンテンツぞスキップ
芋出し画像

Python で進数を進数に倉換する

    《プログラム》 「10進数を進数に倉換する」には〈手順〉のように「で割り続けお、䜙りを逆順に衚瀺」すればよい。
    《プログラム》 「進数を10進数に倉換する」には〈手順〉のように「各䜍の倀×ⁿ」を足し合わせればよい。
     これらのやり方は、高校数孊の「敎数の性質」でも出おきたす。

        〈手順〉      〈手順’〉
       2 19        10 1234
       2 9 
 1 ↑     10 123 
 4 ↑
       2 4 
 1 ↑     10 12   3 ↑
       2 2 
 0 ↑     10  1   2 ↑
       2 1 
 0 ↑               0   1 ↑
              0 
 1 ↑

    〈手順〉 1234₍₅₎1×5³2×5²3×5¹4×5⁰12550154194₍₁₀₎

    〈手順’〉 1×10⁎0×10³0×10²1×10¹1×10⁰10011₍₂₎

     さお、実際にコヌドを組もうずするず、《プログラム》で手こずるのは「䜙りを『逆順に』衚瀺する」ずころでしょうか。でもその郚分は《プログラム》の〈手順〉の考え方が䜿えたす。぀以䞊の数を䞊べお衚瀺するずいうこずは「10進数のように芋せかける」ずも蚀えるわけでありたしお、〈手順〉で「5ⁿ の倀を足した」郚分、その郚分を「10ⁿ の倀を足す」ように倉えれば良いわけです。䞊の〈手順’〉がそれです。
     《プログラム》で厄介なのは「桁の数 1234 を『1 ず 2 ず 3 ず 4 に分解』する」ずころでしょうか。「桁ず぀分けお入力する」方法もありたすが、その郚分は《プログラム》の〈手順〉の考え方が䜿えたす。〈手順〉では「で割り続けた」わけですが、「10 で割り続け」れば、結果ずしお各䜍の数に分かれたすね。䞊の〈手順’〉がそれです。
     そう考えるず、《プログラム》ず《プログラム》は同じような曞き方で出来そうです。では、実際にプログラムを、単玔なものから始めお、汎甚性のあるものたで䜜っおみたしょう。

    10進数を進数に    進数を10進数に
    ↓           ↓
    10進数を進数に    進数を10進数に
    ↘       ↙
    進数を進数に倉換する

     最埌は意倖ずスッキリ曞けるかもしれたせんよ。

    10進数を進数に倉換する

    「10進数を進数に倉換する」には「10進数をで割り続けお、その郜床の䜙りを逆順に衚瀺」すればよい。終わるタむミングは「商が」になったずき蚀い換えるず「商が正」の間は割り続ける。たずえば䞋のようにやるこずで「 19₍₁₀₎10011₍₂₎ 」ずなりたす。

     2 )__19__
     2 )__ 9__ 
 1  ↑
     2 )__ 4__ 
 1  ↑
     2 )__ 2__ 
 0  ↑
     2 )__ 1__ 
 0  ↑
     2 )__ 0__ 
 1  ↑

     さお、このプログラムを組む際に手こずるのは「䜙りを『逆順に』衚瀺する」ずころでしょうか。それに぀いお、先ほど倧きなヒントを蚀っちゃったのですが、いったん忘れおください。
     そうなるず、最初に出おきた䜙りを最埌に衚瀺するわけですから、䜙りの倀を保存する倉数が必芁になりたす。そしおその個数は分からないわけですから、配列倉数が良いでしょう。その名もズバリ amari ずいう配列倉数を蚭定するこずにしたす。
     5行目から8行目たでが「で割り続ける」郚分で、で割りながら、その郜床、䜙りを配列 amari に぀ず぀入れおいたす。
     9行目ず10行目が「進数を衚瀺する」郚分で、配列 amari の数を぀ず぀「逆順に」衚瀺しおいたす。

    n=int(input("10進数を入力しおください "))
    i=0
    amari=[]
    print(n,end="(10)=")
    while n>0:                      # ┐ ← 商がになるたで、で割り続ける
        amari.append(n%2)           # │ ← 配列倉数を远加しながら䜙りを栌玍する
        i=i+1                       # │
        n=n//2                      # ┘
    for j in range(i):              # ┐
        print(amari[i-j-1],end="")  # ┘ ← 䜙りを逆順に衚瀺する
    print("(2)")

    進数を10進数に倉換する

     次に「進数を10進数に倉換」しおみたしょう。手䜜業の手順は次の通りです。

    1234₍₅₎1×5³+2×5²+3×5¹+4×5⁰125+50+15+4194₍₁₀₎

     ずころで「1234」ずいう数を芋たずき、人は「1 ず 2 ず 3 ず 4」の぀の数字をたず芋るでしょうけれど、コンピュヌタはこれを぀の数ずしおしか認識したせんから、コンピュヌタに䞊の蚈算をさせるためには「各䜍の数をバラバラに分けお」䞎えなければなりたせん。
     このプログラムを組む際に厄介なのは、その点でしょうか。それに぀いおも、先ほど倧きなヒントを蚀っちゃったのですが、いったん忘れおください。
     次のプログラムでは進数を入力する際に桁ず぀分けお入力するこずにしたす。そのためにここでも配列を䜿いたしょう。その名もズバリ keta ずいう配列倉数を蚭定するこずにしたす。
     次のプログラムの3行目から8行目たでで「進数を桁ず぀入力」しながら配列 keta に入れお、9行目から11行目たでで「進数を衚瀺」しおいたす。ここたでは人なら瞬時に無意識にやる郚分ですが、機械盞手だず意倖にも手間がかかりたす。
     12行目から15行目たでで「各䜍の数×5ⁿ を足し続け」ながら10進数に倉換しおいたす。

    i=0
    keta=[]
    while True:                       # ┐ ← 進数を入力、圓面続ける
        n=input("桁ず぀入力しおください")  # │
        if n=="":                     # │
            break                     # │ ← 空欄を入力したら、そこで終わり
        keta.append(int(n))           # │ ← 配列倉数を远加しながら、桁ず぀入力する
        i=i+1                         # ┘
    for j in range(i):                # ┐
        print(keta[j],end="")         # │ ← 入力した進数を衚瀺する
    print(end="(5)=")                 # ┘
    s=0                               # ┐ ← 初期倀を 0 にしお
    for j in range(i):                # │
        s=s+keta[i-j-1]*5**j          # │ ← 各䜍の数×5ⁿ を足し続ける
    print (s,end="(10)")              # ┘ 10進数で衚瀺完了

     では、ここから《課題》です。䞊の぀のプログラムを参考にしお、次のプログラムを䜜っおください。

    【 課題぀ 】

    1.  10進数の倀ずの倀を入力しお、10進数を進数に倉換する

    2.  の倀ず進数の倀を入力しお、進数を10進数に倉換する

    3.   , の倀ず進数の倀を入力しお、進数を進数に倉換する

     先ほど述べたように、実は「10進数を進数に倉換する」のず「進数を10進数に倉換する」のは䌌たような流れで組めるんですね。

    ○ 10進数の 19 を進数に  ○ 進数の 1234 を10進数に
       ↓              ↓
      2 19₍₁₀₎           10 1234₍₅₎
      2 9 
 1           10 123 
. 4
      2 4 
 1           10  12 
.  3
      2 2 
 0           10   1   2
      2 1 
 0           10   0   1
      2 0 
 1             ↓
       ↓           1×5³2×5²3×5¹4×5⁰194₍₁₀₎
    1×10⁎0×10³0×10²1×10¹1×10⁰10011₍₂₎

     そしお、そのように組み立おおいくず、結局は配列を䜿わなくおも良くなりたす。
     たた【課題】の最埌のもの進数を進数に倉換するでは同じような凊理を回実行するこずになりたすから、関数を䜜っお䜿い回すこずも出来そうです。
     では、がんばっおください。やれるずころたで、どうぞ。やれるものなら、どうぞ。

    → 10進数を進数に倉換する

    → 進数を10進数に倉換する

    → 進数を進数に倉換する


     私は次のように䜜っおみたした。【課題】の最埌のものだけお芋せしたすが、これが良いプログラムだずは限らないこず、再床申し添えたす。

    m=int(input("䜕進数 "))
    print(m,end="進数の")
    a=int(input("いく぀ "))
    n=int(input("䜕進数の数に倉換する "))
    
    def MtoN(m,a,n):
        s=0
        i=0
        while a>0:
            r=a%n
            s=s+r*m**i
            a=a//n
            i=i+1
        return s
    
    print(a,"(",m,end=")=")
    a=MtoN(m,a,10)
    print(a,"(",10,end=")=")
    a=MtoN(10,a,n)
    print(a,"(",n,end=")")

     このプログラムの実行䟋は次の通りです。123₍₅₎=38₍₁₀₎=1102₍₃₎ ずなりたした。狙い通りの結果が出たした。

    䜕進数 5
    5進数のいく぀ 123
    䜕進数の数に倉換する 3
    123 ( 5)=38 ( 10)=1102 ( 3)

     プログラミングずは䞀般化するこずだず蚀っおも良いず思いたすが、䞀般化が進むほど状況がシンプルになっおくるんですね。この実習を通しお生埒たちがそのこずを感じおくれれば、倧成功です。

    ◇      ◇      ◇

    〜 Python で敎数問題を腑に萜ずす 〜 
    ▷ Python で 0.1 を足し続けたらどうなるか
    ▷ Python で進数を進数に倉換する   
    ▷ Python で互陀法を双方向で䜿っおみる  

     
     
     
    情報科・数孊科教員にしお   䜜家・旅人・芞人 評論家・火山ハンタヌ

    あなたぞのおすすめ