今回は京都大学の数学の入試問題を
プログラミングで解いてみました。
解説動画はこちら
今回の問題は
10進法で表された数 6.75 を2進数で表せ
また、この数と2進法で表された数
101.0101 との積として与えられる数を
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 との積として与えられる数を
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進数の計算という
面倒くさい計算をすることとなりました。
数値計算もプログラミングであれば
比較的簡単ですかねーーー
今回はこれまでです。
それでは。
