主题:奇数阶偶数阶幻方通用程序!
[b][size=3]我今天终于编出了幻方(奇数阶偶数阶通用)程序!!!!![/size][/b]
因为奇数阶幻方课本上有介绍规律,所以编程起来比较容易;
不过我又发现了偶数阶的幻方的规律!
因为偶数阶幻方有这样一个规律——
比如说四阶,先把所有的按顺序填好。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
然后对角线的1,6,11,16,4,7,10,13不动
其他的和相对的数对调:2和15,3和14,5和12,9和8
最后答案就是:
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
可以先全部按顺序排好然后对调。
4阶幻方如下:
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
需要对调的是:
第一列有2,1——3,4
3,4=(1+2),(2+2)
3,1——2,4
2,4=(1+1),(3+1)
第二列有1,2——4,3
4,3=(2+2),(1+2)
4,2——1,3
1,3=(2+-1),(4+-1)
按半边算,先把i和j调换,然后要换的就是(j+x),(i+x)
x在第一列的第一行为3,每往下移一行就-1;
x在第二列的第一行为2,每往下移一行就-1。
其他偶数阶幻方也有这个特征。
程序如下:
CLS
DO
INPUT n
LOOP UNTIL n > 2 AND n < 21
DIM a(n, n)
a$ = STRING$(LEN(STR$(n * n)), "#")
IF n MOD 2 <> 0 THEN
p = n \ 2 + 1
a(1, p) = 1
i1 = 1
j1 = p
i = 1
DO
i2 = i1: j2 = j1
i1 = i1 - 1
IF i1 < 1 THEN i1 = n
j1 = j1 + 1
IF j1 > n THEN j1 = 1
IF a(i1, j1) <> 0 THEN
i1 = i2 + 1
IF i1 > n THEN i1 = 1
j1 = j2
END IF
i = i + 1
a(i1, j1) = i
LOOP UNTIL i = n * n
ELSE
FOR i = 1 TO n
FOR j = 1 TO n
s = s + 1
a(i, j) = s
NEXT j
NEXT i
FOR j = 1 TO n / 2
p = p + 1
b = n - p
FOR i = 1 TO n
IF i <> j AND i + j <> n + 1 THEN
SWAP a(i, j), a(j + b, i + b)
END IF
b = b - 1
NEXT i
NEXT j
END IF
FOR i = 1 TO n
FOR j = 1 TO n
PRINT USING a$; a(i, j);
NEXT j
PRINT
NEXT i
END
偶数阶幻方的规律是我花了很长时间才找到的,求大家多多表扬。。。
因为奇数阶幻方课本上有介绍规律,所以编程起来比较容易;
不过我又发现了偶数阶的幻方的规律!
因为偶数阶幻方有这样一个规律——
比如说四阶,先把所有的按顺序填好。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
然后对角线的1,6,11,16,4,7,10,13不动
其他的和相对的数对调:2和15,3和14,5和12,9和8
最后答案就是:
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
可以先全部按顺序排好然后对调。
4阶幻方如下:
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
需要对调的是:
第一列有2,1——3,4
3,4=(1+2),(2+2)
3,1——2,4
2,4=(1+1),(3+1)
第二列有1,2——4,3
4,3=(2+2),(1+2)
4,2——1,3
1,3=(2+-1),(4+-1)
按半边算,先把i和j调换,然后要换的就是(j+x),(i+x)
x在第一列的第一行为3,每往下移一行就-1;
x在第二列的第一行为2,每往下移一行就-1。
其他偶数阶幻方也有这个特征。
程序如下:
CLS
DO
INPUT n
LOOP UNTIL n > 2 AND n < 21
DIM a(n, n)
a$ = STRING$(LEN(STR$(n * n)), "#")
IF n MOD 2 <> 0 THEN
p = n \ 2 + 1
a(1, p) = 1
i1 = 1
j1 = p
i = 1
DO
i2 = i1: j2 = j1
i1 = i1 - 1
IF i1 < 1 THEN i1 = n
j1 = j1 + 1
IF j1 > n THEN j1 = 1
IF a(i1, j1) <> 0 THEN
i1 = i2 + 1
IF i1 > n THEN i1 = 1
j1 = j2
END IF
i = i + 1
a(i1, j1) = i
LOOP UNTIL i = n * n
ELSE
FOR i = 1 TO n
FOR j = 1 TO n
s = s + 1
a(i, j) = s
NEXT j
NEXT i
FOR j = 1 TO n / 2
p = p + 1
b = n - p
FOR i = 1 TO n
IF i <> j AND i + j <> n + 1 THEN
SWAP a(i, j), a(j + b, i + b)
END IF
b = b - 1
NEXT i
NEXT j
END IF
FOR i = 1 TO n
FOR j = 1 TO n
PRINT USING a$; a(i, j);
NEXT j
NEXT i
END
偶数阶幻方的规律是我花了很长时间才找到的,求大家多多表扬。。。