Vorige Pagina About the Author

' Searches for 4 x 4 Magic Squares of Squares

' Tested with Office 2007 under Windows 7

Sub SqrSqr4a()

Dim a(16)

y = MsgBox("Locked", vbCritical, "Routine SqrsSqrs4a")
End
    
    n1 = 0: n9 = 0: n10 = 0: k1 = 1: k2 = 1
    m1 = 0: m2 = 87
    m3 = m1 ^ 2: m4 = m2 ^ 2
    
    sMin = 2823
    sMax = 9775
 
    Sheets("Klad1").Select
    
    t1 = Timer
   
For j100 = sMin To sMax         'Magic sum

n10 = 0: s1 = j100
Cells(k1 + 1, 1).Value = j100

For j16 = m1 To m2                                          'a(16) = 9
Cells(k1 + 2, 1).Value = j16
a(16) = j16 ^ 2

For j15 = m1 To m2                                          'a(15) = 44
Cells(k1 + 3, 1).Value = j15
a(15) = j15 ^ 2
i10 = 15: GoSub 850: If fl1 = 0 Then GoTo 150

For j14 = m1 To m2                                          'a(14) = 27
a(14) = j14 ^ 2
i10 = 14: GoSub 850: If fl1 = 0 Then GoTo 140

a(13) = s1 - a(14) - a(15) - a(16)
If a(13) < m3 Or a(13) > m4 Then GoTo 140
i10 = 13: GoSub 850: If fl1 = 0 Then GoTo 140
a2 = Sqr(a(13)): If Int(a2) <> a2 Then GoTo 140

For j12 = m1 To m2                                          'a(12) = 42
a(12) = j12 ^ 2
i10 = 12: GoSub 850: If fl1 = 0 Then GoTo 120

For j11 = m1 To m2                                          'a(11) = 13
a(11) = j11 ^ 2
i10 = 11: GoSub 850: If fl1 = 0 Then GoTo 110

For j10 = m1 To m2                                          'a(10) = 36
a(10) = j10 ^ 2
i10 = 10: GoSub 850: If fl1 = 0 Then GoTo 100

a(9) = s1 - a(10) - a(11) - a(12)
If a(9) < m3 Or a(9) > m4 Then GoTo 100
i10 = 9: GoSub 850: If fl1 = 0 Then GoTo 100
a2 = Sqr(a(9)): If Int(a2) <> a2 Then GoTo 100

For j8 = m1 To m2                                           'a(8) = 32
a(8) = j8 ^ 2

a(7) = a(8) - a(10) + a(12) - a(13) + a(16)
If a(7) < m3 Or a(7) > m4 Then GoTo 80
a2 = Sqr(a(7)): If Int(a2) <> a2 Then GoTo 80
a(6) = s1 - a(8) - a(11) - a(12) + a(13) - a(16)
If a(6) < m3 Or a(6) > m4 Then GoTo 80
a2 = Sqr(a(6)): If Int(a2) <> a2 Then GoTo 80
a(5) = -a(8) + a(10) + a(11)
If a(5) < m3 Or a(5) > m4 Then GoTo 80
a2 = Sqr(a(5)): If Int(a2) <> a2 Then GoTo 80
a(4) = s1 - a(7) - a(10) - a(13)
If a(4) < m3 Or a(4) > m4 Then GoTo 80
a2 = Sqr(a(4)): If Int(a2) <> a2 Then GoTo 80
a(3) = -s1 - a(8) + a(9) + 2 * a(10) + 2 * a(13) + a(14)
If a(3) < m3 Or a(3) > m4 Then GoTo 80
a2 = Sqr(a(3)): If Int(a2) <> a2 Then GoTo 80
a(2) = a(8) - a(9) - 2 * a(10) + a(15) + 2 * a(16)
If a(2) < m3 Or a(2) > m4 Then GoTo 80
a2 = Sqr(a(2)): If Int(a2) <> a2 Then GoTo 80
a(1) = a(8) + a(12) - a(13)
If a(1) < m3 Or a(1) > m4 Then GoTo 80
a2 = Sqr(a(1)): If Int(a2) <> a2 Then GoTo 80

'                           Exclude solutions with identical numbers

                            GoSub 800: If fl1 = 0 Then GoTo 80
                           
'                           n9 = n9 + 1: GoSub 640 'Print results (selected numbers)
                            n10 = n10 + 1
                            n9 = n9 + 1: GoSub 650 'Print results (squares)
                            GoTo 1000              'Print only first square
                            
80 Next j8

100 Next j10
110 Next j11
120 Next j12

140 Next j14
150 Next j15
160 Next j16

n10 = 0

1000 Next j100

   t2 = Timer
    
   t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions"
   y = MsgBox(t10, 0, "Routine SqrsSqrs4a")

End

'   Print results (selected numbers)

640 For i1 = 1 To 16
        Cells(n9, i1).Value = a(i1)
    Next i1
    
    Return

'   Print results (squares)

650 n2 = n2 + 1
    If n2 = 5 Then
        n2 = 1: k1 = k1 + 5: k2 = 1
    Else
        If n9 > 1 Then k2 = k2 + 5
    End If

    Cells(k1, k2 + 1).Select
    Cells(k1, k2 + 1).Font.Color = -4165632
    If n10 = 1 Then
        Cells(k1, k2 + 1).Value = CStr(n10) + " (MC = " + CStr(s1) + " )"
    Else
        Cells(k1, k2 + 1).Value = CStr(n10)
    End If
    
    i3 = 0
    For i1 = 1 To 4
        For i2 = 1 To 4
            i3 = i3 + 1
            Cells(k1 + i1, k2 + i2).Value = a(i3)
        Next i2
    Next i1

    Return

'   Exclude solutions with identical numbers

800 fl1 = 1
    For j1 = 1 To 16
       a2 = a(j1)
       For j2 = (1 + j1) To 16
           If a2 = a(j2) Then fl1 = 0: Return
       Next j2
    Next j1
    Return

'   Exclude solutions with identical numbers (intermediate check)

850 fl1 = 1
    j1 = i10
    a2 = a(j1)
    For j2 = (1 + j1) To 16
        If a2 = a(j2) Then fl1 = 0: Return
    Next j2
    Return
    
End Sub

Vorige Pagina About the Author