第18講 n進数演算−−−加法
第9話 足し算マクロ解説その3
を実現するプログラム主要部分再掲
Sub s(a() As Integer, b() As Integer, c() As Integer, n As Integer)
Dim i As Integer, ik1 As Integer, ik2 As Integer, mx As Integer
i = 0
Do While 1
If a(i) = n Then
a(i) = 0
ik1 = i
Exit Do
Ena If
i = i + 1
Loop
i = 0
Do While 1
If b(i) = n Then
b(i) = 0
ik2 = i
Exit Do
Ena If
i = i + 1
Loop
mx = ik1
If mx < ik2 Then mx = ik2
For i = 0 To mx - 1
c(i) = c(i) + a(i) + b(i)
c(i + 1) = c(i + 1) + Int(c(i) / n)
c(i) = c(i) Mod n
Next
If c(mx) = 0 Then
c(mx) = n
Else
c(mx + 1) = n
Ena If
For i = 0 To mx
If c(i) < n Then Cells(6, 1 + mx - i) = c(i)
Next
a(ik1) = n
b(ik2) = n
Ena Sub
参考ダウンロード添付ファイル
いよいよ核心部分
For i = 0 To mx - 1
c(i) = c(i) + a(i) + b(i)
c(i + 1) = c(i + 1) + Int(c(i) / n)
c(i) = c(i) Mod n
Next
の解説です。
私もここは、かなり考えました。
「Eclipse C++入門講義」や「excel 2013 2010 2007 vba 入門」などで、
何回も組んだ体験があるのにもかかわらず、
最初はうっかり
For i = 0 To mx - 1
If i>0 Then
c(i) = (a(i) + b(i) + c(i-1)) Mod n
c(i+1) = Int((a(i) + b(i)+ c(i-1))/n)
Else
c(i) = (a(i) + b(i)) Mod n
c(i+1) = Int((a(i) + b(i))/n)
End If
Next
としてしまいました。
参考ダウンロード添付ファイル
ですが、これだと、
となって上手くいきません。
なぜ、上手くいかないのでしょうか。
a(0)=3,a(1)=3,a(2)=1,a(3)=1,a(4)=4,a(5)=0,a(6)=4,a(7)=4,a(8)=0
b(0)=0,b(1)=2,b(2)=5,b(3)=4,b(4)=2,b(5)=5,b(6)=5,b(7)=5,b(8)=0
トレースしてみましょう。
i = 0 のとき、
Else
c(i) = (a(i) + b(i)) Mod n
c(i+1) = Int((a(i) + b(i))/n)
が実行されて、
c(0) = (a(0) + b(0)) Mod 6
c(0+1) = Int((a(0) + b(0))/n)
から、
c(0) = (3 + 0) Mod 6
c(0+1) = Int((3+ 0)/6)
すなわち
c(0) = 3
c(1) = 0
というわけで、正しく計算できています。
i = 1 のとき、
If i>0 Then
c(i) = (a(i) + b(i) + c(i-1)) Mod n
c(i+1) = Int((a(i) + b(i)+ c(i-1))/n)
が実行されて、
c(1) = (a(1) + b(1) + c(1-1)) Mod n
c(1+1) = Int((a(1) + b(1) + c(1-1))/n)
から、
c(1) = (3 + 2 + 3) Mod 6
c(2) = Int((3 + 2 + 3)/6)
すなわち
c(1) = 2
c(2) = 1
というわけで、この段階で間違いが分かります。
3+2で繰り上がりは発生しないのに、
c(2) = 1と1繰り上がったことになっています。
原因は、
If i>0 Then
c(i) = (a(i) + b(i) + c(i-1)) Mod n
c(i+1) = Int((a(i) + b(i) + c(i-1))/n)
のピンクにあることが分かります。
でしたら、
For i = 0 To mx - 1
If i > 0 Then
c(i) = (a(i) + b(i) + c(i)) Mod n
c(i + 1) = Int(c(i) / n)
Else
c(i) = (a(i) + b(i)) Mod n
c(i + 1) = Int((a(i) + b(i)) / n)
End If
Next
と変更したら上手くいくでしょうか。
i = 1 のとき、
If i>0 Then
c(i) = (a(i) + b(i) + c(i)) Mod n
c(i + 1) = Int(c(i) / n)
が実行されて、
c(1) = (a(1) + b(1) + c(1)) Mod 6
c(1+1) = Int(c(1) / 6)
から、
c(1) = (3 + 2 + 0) Mod 6
c(2) = Int(5/6)
すなわち
c(1) = 5
c(2) = 0
今回は上手くいっています。
i = 2 のとき、
If i>0 Then
c(i) = (a(i) + b(i) + c(i)) Mod n
c(i + 1) = Int(c(i) / n)
が実行されて、
c(2) = (a(2) + b(2) + c(2)) Mod 6
c(2+1) = Int(c(2) / 6)
から、
c(1) = (1 + 5 + 0) Mod 6
c(2) = Int(0/6)
すなわち
c(1) = 0
c(2) = 0
残念ながら、繰り上がりに失敗しています。
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ