筆算による開平計算の自動化
まずはこちらの記事をご覧ください.
筆算によって,様々な正の平方根の値を求めました.小数点以下になればなるほど,計算の面倒臭さが増していきます.頭がおかしくなるかと思いました.
そこで考えたのです.
「筆算の過程をプログラムに出力させれば良いんじゃね?」
というわけで,テキトーに書いたコードがこちらです.
import re
# 入力 平方根を求めたい実数
n = input()
# ループの回数
k = 15
# 整数部分と小数部分の分離
m = re.match(r"(\d+)\.?(\d*)", n)
integer_part, fractional_part = m.groups()
integer_part_list = list(integer_part)
fractional_part_list = list(fractional_part)
# 2桁区切りのリストを作成(整数部分)
integer_list = []
# 奇数桁の場合は頭は1桁
if len(integer_part_list) % 2 == 1:
integer_list.append(int(integer_part_list.pop(0)))
# 2桁区切り
for i in range(int((len(integer_part_list)/2))):
integer_list.append(int(integer_part_list[i*2])*10+int(integer_part_list[i*2+1]))
# 2桁区切りのリストを作成(小数部分)
fractional_list = []
# 小数点以下の数字が奇数個の場合は0でパディング
if len(fractional_part_list) % 2 == 1:
fractional_part_list.append('0')
# 2桁区切り
for i in range(int((len(fractional_part_list)/2))):
fractional_list.append(int(fractional_part_list[i*2])*10 + int(fractional_part_list[i*2+1]))
# 次の桁の値を探す関数
def extraction_sqrt(amari, left_num, block_num):
amari = amari * 100 + block_num
# 次の桁の値を探す
next_num = 9
while (left_num * 10 + next_num) * next_num > amari:
next_num -= 1
# 計算結果を出力
print((left_num * 10 + next_num), end=' ')
print(amari)
print(next_num, end=' ')
print((left_num * 10 + next_num) * next_num)
# 新しい余りと左側の計算
amari = amari - ((left_num * 10 + next_num) * next_num)
left_num = (left_num * 10 + next_num) + next_num
return amari, left_num
amari = 0
left_num = 0
# 整数部分の計算
for block_num in integer_list:
amari, left_num = extraction_sqrt(amari, left_num, block_num)
# 小数部分の計算
for block_num in fractional_list:
amari, left_num = extraction_sqrt(amari, left_num, block_num)
# 小数部分の計算をk回繰り返す.
for a in range(k):
amari, left_num = extraction_sqrt(amari, left_num, 0)
\sqrt{10}の出力はこんな感じ↓
3 10
3 9
61 100
1 61
626 3900
6 3756
6322 14400
2 12644
63242 175600
2 126484
632447 4911600
7 4427129
6324547 48447100
7 44271829
63245546 417527100
6 379473276
632455526 3805382400
6 3794733156
6324555320 1064924400
0 0
63245553201 106492440000
1 63245553201
632455532026 4324688679900
6 3794733192156
6324555320328 52995548774400
8 50596442562624
63245553203363 239910621177600
3 189736659610089
632455532033667 5017396156751100
7 4427188724235669
6324555320336749 59020743251543100
9 56920997883030741
表示位置のズレが気になりますが,もうメンドクサイのでこれで良しとしましょう.