第5講 問題における数字の配置をいかにするか?
第4話 はじめる位置・飛び・ヒント数をシートから取得する!
Ⅰ
①はじめる位置
②飛び
③ヒント数もシートから取得する
のいずれもシートから取得する
*シートに入力した数字が81と互いに素でないときは、
飛びに指定されている数字は81と互いに素ではありませんと表示してプログラムを実行しない
の解答例
Dim w As Integer, tb As Integer, hnt As Integer, iz(80) As Byte, jz(80) As Byte
'wははじめる位置、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Private Sub CommandButton1_Click()
CommandButton2_Click
w = Cells(4, 15)
tb = Cells(5, 15)
hnt = Cells(6, 15)
hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
Dim i As Integer, a As Integer
For i = 2 To tb '81と互いに素になるtbを自動的に探す。
If i * i > tb Then Exit For
If (81 Mod i) = 0 Then
If (tb Mod i) = 0 Then
Cells(7, 12) = "飛びに入力されている値は81と互いに素ではありません。入力し直して再度問題作成ボタンを押してください。"
Exit Sub
End If
End If
Next
For i = 0 To hnt - 1
a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
iz(i) = Int(a / 9)
jz(i) = i Mod 9
Cells(4 + iz(i), 2 + jz(i)) = "*"
Next
End Sub
Private Sub CommandButton2_Click()
Range("B4:J12").Select
Selection.ClearContents
Range("L7").Select
Selection.ClearContents
Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル
Ⅱ
①はじめる位置は0以上80以下のランダムな数字とする
②飛びはシートから取得する
③ヒント数もシートから取得する
はじめる位置はシートに表示する
*シートに入力した数字が81と互いに素でないときは、
飛びに指定されている数字は81と互いに素ではありませんと表示してプログラムを実行しない
の解答例
'wははじめる位置、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Dim tb As Integer, hnt As Integer, iz(80) As Byte, jz(80) As Byte
Private Sub CommandButton1_Click()
CommandButton2_Click
tb = Cells(4, 15)
hnt = Cells(5, 15)
hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
Dim i As Integer, a As Integer, w As Integer
w = Int(81 * Rnd)
For i = 2 To tb '81と互いに素になるtbを自動的に探す。
If i * i > tb Then Exit For
If (81 Mod i) = 0 Then
If (tb Mod i) = 0 Then
Cells(7, 12) = "飛びに入力されている値は81と互いに素ではありません。入力し直して再度問題作成ボタンを押してください。"
Exit Sub
End If
End If
Next
For i = 0 To hnt - 1
a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
iz(i) = Int(a / 9)
jz(i) = a Mod 9
Cells(4 + iz(i), 2 + jz(i)) = "*"
Next
End Sub
Private Sub CommandButton2_Click()
Range("B4:J12").Select
Selection.ClearContents
Range("L7").Select
Selection.ClearContents
Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル
次の課題です。
Ⅰ
①はじめる位置は0以上80以下のランダムな数字とする
②飛びも2以上78以下のランダムな数字とする
③ヒント数もシートから取得する
ただし、②は81と互いに素でない場合が出てしまいますから、
Do While文を永久ループにしておいて使い互いに素なときだけ、
Do文を強制的に抜けるようにして問題を解消してください。
Ⅱ
Ⅰと同じ条件ですが、w + tb * iがあるために、すべての変数をInteger型にしてありますが、
工夫してすべてByte型に戻してください。
Ⅱのヒントは
(250 + 120 * 200) mod 7
と
((250 mod 7)+ (120 mod 7) * (200 mod 7)) mod 7
を計算してみてください。
一般に
(a + b) mod x=(a mod x) + (b mod x)
(a * b) mod x=(a mod x) * (b mod x)
という法則が成り立ちます。