В магическом квадрате 3х3 расставить 9 степеней - VB
Формулировка задачи:
в магическом квадрате 3х3 расставить 9 степеней чиста 2 таким образом, чтобы произведение чисел, стоящих в каждой строке, столбце и на диагонали были равны.
Решение задачи: «В магическом квадрате 3х3 расставить 9 степеней»
textual
Листинг программы
Option Explicit
Dim F As Boolean, SSS As String
Private Sub Command1_Click()
F = false
SSS = ""
Call WeTrastInVB("123456789")
MsgBox IIf(F, SSS, "Таких магических квадратов не существует!")
End Sub
Private Function WeTrastInVB(S As String, Optional SS As String = "") As Boolean
Dim i As Integer
If Len(S) = 1 Then
If TryMagicSquare(SS & S) Then F = True
Else
For i = 1 To Len(S)
WeTrastInVB Left$(S, i - 1) & Mid$(S, i + 1), SS & Mid$(S, i, 1)
Next
End If
End Function
Private Function TryMagicSquare(ByVal S As String) As Boolean
Dim i As Integer, j As Integer, k As Integer
Const n As Integer = 3 'n = UBound(A, 1)
Dim A(1 To n, 1 To n) As Long, P(1 To 4) As Long
For i = 1 To n
For j = 1 To n
k = k + 1
A(i, j) = 2 ^ CInt(Mid(S, k, 1))
Next j
Next i
P(1) = 1: P(2) = 1
For i = 1 To n
P(1) = P(1) * A(i, i) 'произведение элементов главной диагонали
P(2) = P(2) * A(i, n - i + 1) 'произведение элементов побочной диагонали
Next i
If P(1) <> P(2) Then Exit Function
For i = 1 To n
P(3) = 1: P(4) = 1
For j = 1 To n
P(3) = P(3) * A(i, j) 'произведение элементов i-ой строки
P(4) = P(4) * A(j, i) 'произведение элементов i-го столбца
Next j
If (P(1) <> P(3)) Or (P(1) <> P(4)) Then Exit Function
Next i
SSS = SSS & strMagicSquare(A) & vbCrLf
TryMagicSquare = True
End Function
Private Function strMagicSquare(ByRef A() As Long) As String
Dim i As Integer, j As Integer, S As String
Dim n As Integer: n = UBound(A, 1)
For i = 1 To n
For j = 1 To n
S = S & A(i, j) & vbTab
Next j
S = S & vbCrLf
Next i
strMagicSquare = S
End Function