今回は京都大学の数学の入試問題を
プログラミングで解いてみました。

解説動画はこちら


今回の問題は

10進法で表された数 6.75 を2進数で表せ

また、この数と2進法で表された数
101.0101 との積として与えられる数を
2進法 および 4進法で表せ

2段階の問題となっています。

まず2進数に直してみましょう。

bin(数値)
で2進数に直すことができます。
bin(6.75)
TypeError: 'float' object cannot be interpreted as an integer

おっと
エラーが出てしまいました。

binでは整数値しか対応しておらず
小数点値を2進数に直すことができません。

整数部分は簡単に直すことができますが
小数点部分は考えないとダメですね。

小数点の2進数の考え方ですが
小数点第一位から
2分の1 , 4分の1・・・
と言う様に、2の小数点の桁乗で割った数を
基準に考えると直すことができます。

ということで小数点値を2進数に直す関数を
作ってみました。
from decimal import Decimal

def float2bin(num):
    a,b,i= [],[],0 
    n = int(num)
    f = Decimal(str(num)) - Decimal(str(n))
    while n !=0:
        a.append(str(n % 2))
        n = n // 2
    a.reverse()
    while (f != 0):
        t = f * 2
        b.append(str(int(t)))
        f = t - int(t)
        i +=1
        if i >= 10:
            break
    return float('{0}.{1}'.format(''.join(a),''.join(b)))

さてこれで求められるハズです。
10進法で表された数 6.75 を2進数の答えは
print(float2bin(6.75))
110.11

2分の1 + 4分の1 = 0.75
になるので、2進数の小数点部分は
.11ですね。


さて問題にはまだ続きがありますね。

また、この数と2進法で表された数
101.0101 との積として与えられる数を
2進法 および 4進法で表せ

Pythonでは通常の計算は
10進数での計算なので
101.0101 これを10進数に直してあげないと
計算できないですね。

2進数の小数値を10進数に直す
関数を作りましょう。

こんな感じになりました。
from decimal import Decimal

def bin2float(num):
    e,h = [],[]
    n = int(num)
    f = Decimal(str(num)) - Decimal(str(n))
    t = [s for s in str(n)[::-1]]
    for i,s in enumerate(t):
        e.append(int(s)*(2 ** i))
    a = sum(e)
    g = [s for s in str(f)[2:]]
    for i,s in enumerate(g,start=1):
        h.append(int(s)*(1/(2 ** i)))
    b = sum(h)
    return a+b
これで2進数を10進数に直します。

2進数 101.0101の10進数は
print(bin2float(101.0101))
5.3125

10進数同士の積は
6.75 * 5.3125
35.859375

楽ですね。


6.75との積の2進数は?
print(float2bin(6.75 * bin2float(101.0101)))
100011.110111

はい出ました、めちゃくちゃ面倒くさい

問題の最後は
4進数に直した答えも出せ
でしたね。

10進数を4進数に直す関数も
作りましょう。

中身を2から4に変えただけです。
from decimal import Decimal

def float4bin(num):
    a,b,i= [],[],0 
    n = int(num)
    f = num - n
    while n !=0:
        a.append(str(n % 4))
        n = n // 4
    a.reverse()
    while (f != 0):
        t = f * 4
        b.append(str(int(t)))
        f = t - int(t)
        i +=1
        if i >= 10:
            break
    return float('{0}.{1}'.format(''.join(a),''.join(b)))
これで4進数の答えが出せますね

6.75との積の4進数は?
print(float4bin(6.75 * bin2float(101.0101)))
203.313

はいできました。

かなり面倒くさいですね。
小数点値も計算できるライブラリが
実装されることを願いたいところですね。

今回は小数点値の2,4,10進数の計算という
面倒くさい計算をすることとなりました。

数値計算もプログラミングであれば
比較的簡単ですかねーーー

今回はこれまでです。
それでは。