今度は引き算を試してみます。関数 minus() を書きました。繰り下がりは、あれば cf = 1とし、なければ cf = 0 で処理します。各桁ごとに1桁の数の引き算をし、結果が負になったら繰り下がりありとして引き算の結果には10を加えます。これを繰り返します。
import sys Uketa = 7 Dketa = 7 global AU, AD, BU, BD, CU, CD AU = [0.0] * Uketa AD = [0.0] * Dketa BU = [0.0] * Uketa BD = [0.0] * Dketa CU = [0.0] * Uketa CD = [0.0] * Dketa # #plus(LU, LD, MU, MD, SU, SD)コールで #SU.SD = LU.LD + MU.MD と入る # def plus(LU, LD, MU, MD, SU, SD): cf = 0 for i in range(Dketa): SD[Dketa - i - 1] = LD[Dketa - i - 1] + MD[Dketa - i - 1] + cf cf = 0 if SD[Dketa - i - 1] >= 10: SD[Dketa - i - 1] -= 10 cf = 1 for i in range(Uketa): SU[Uketa - i - 1] = LU[Uketa - i - 1] + MU[Uketa - i - 1] + cf cf = 0 if SU[Uketa - i - 1] >= 10: SU[Uketa - i - 1] -= 10 cf = 1 # #minus(LU, LD, MU, MD, SU, SD)コールで #SU.SD = LU.LD - MU.MD と入る # def minus(LU, LD, MU, MD, SU, SD): cf = 0 for i in range(Dketa): SD[Dketa - i - 1] = LD[Dketa - i - 1] - MD[Dketa - i - 1] - cf cf = 0 if SD[Dketa - i - 1] < 0: SD[Dketa - i - 1] += 10 cf = 1 for i in range(Uketa): SU[Uketa - i - 1] = LU[Uketa - i - 1] - MU[Uketa - i - 1] - cf cf = 0 if SU[Uketa - i - 1] < 0: SU[Uketa - i - 1] += 10 cf = 1 AU = [0, 0, 0, 6, 8, 3, 1] AD = [6, 5, 9, 1, 0, 0, 0] BU = [0, 0, 0, 5, 9, 1, 9] BD = [4, 7, 2, 3, 0, 0, 0] plus(AU, AD, BU, BD, CU, CD) print('plus ', CU, CD) minus(AU, AD, BU, BD, CU, CD) print('minus ', CU, CD) sys.exit()
実行結果は以下の通りです。
plus [0, 0, 1, 2, 7, 5, 1] [1, 3, 1, 4, 0, 0, 0]
minus [0, 0, 0, 0, 9, 1, 2] [1, 8, 6, 8, 0, 0, 0]
大丈夫みたいですね。ただ、引き算の結果が負になるようなことがあるとおかしな結果になります。なので、円周率の計算では注意しなければなりません。でも、
を使うつもりなので、引き算の結果が負になる心配は要りません。負の項はその左の正の項よりも絶対値が小さいからです。
次はかけ算。すでに書いた、plus()を繰り返し利用すればいいわけですね。やってみます。