n阶蛇形矩阵
n为奇数时,如:
15
7
6
2
1
16
14
8
5
3
22
17
13
9
4
23
21
18
12
10
25
24
20
19
11
\begin{matrix}15 & 7 & 6 & 2 & 1 \\16 & 14 & 8 & 5 & 3 \\ 22 & 17 & 13 & 9 & 4 \\ 23 & 21 & 18 &12 & 10\\ 25 & 24 & 20 & 19 & 11\\ \end{matrix}
15162223257141721246813182025912191341011
其中可以得出:
中心数字
13
=
1
2
(
n
2
+
1
)
,
中心数字
=
a
n
n
+
1
2
(
n
−
1
)
,
所以
a
n
n
=
1
2
(
n
2
−
n
+
2
)
中心数字13=\frac{1}{2}(n^2+1),中心数字=a_{nn}+\frac{1}{2}(n-1),\\所以a_{nn}=\frac{1}{2}(n^2-n+2)
中心数字13=21(n2+1),中心数字=ann+21(n−1),所以ann=21(n2−n+2)
a
n
−
2
,
n
=
a
n
n
−
(
n
−
1
)
−
(
n
−
2
)
a_{n-2,n}=a_{nn}-(n-1)-(n-2)
an−2,n=ann−(n−1)−(n−2),
a
n
−
4
,
n
=
a
n
−
2
,
n
−
(
n
−
3
)
−
(
n
−
4
)
a_{n-4,n}=a_{n-2,n}-(n-3)-(n-4)
an−4,n=an−2,n−(n−3)−(n−4)
推出:
a
n
−
2
j
,
n
=
a
n
n
−
[
(
n
−
1
)
+
(
n
−
2
)
+
⋯
+
(
n
−
2
j
)
]
=
a
n
n
−
(
2
n
−
2
j
−
1
)
j
a_{n-2j,n}=a_{nn}-[(n-1)+(n-2)+\dots+(n-2j) ]=a_{nn}-(2n-2j-1)j
an−2j,n=ann−[(n−1)+(n−2)+⋯+(n−2j)]=ann−(2n−2j−1)j
由观察得出:
a
n
−
2
j
−
i
,
n
−
i
=
a
n
n
−
(
2
n
−
2
j
−
1
)
j
+
i
a_{n-2j-i,n-i}=a_{nn}-(2n-2j-1)j+i
an−2j−i,n−i=ann−(2n−2j−1)j+i
同理可得:
a
n
−
i
,
n
−
2
j
−
i
=
a
n
n
+
[
(
n
)
+
(
n
−
1
)
+
⋯
+
(
n
−
2
j
+
1
)
]
+
i
=
a
n
n
+
(
2
n
−
2
j
+
1
)
j
+
i
a_{n-i,n-2j-i}=a_{nn}+[(n)+(n-1)+\dots+(n-2j+1) ]+i=a_{nn}+(2n-2j+1)j+i
an−i,n−2j−i=ann+[(n)+(n−1)+⋯+(n−2j+1)]+i=ann+(2n−2j+1)j+i
对于:
a
n
−
(
2
j
+
1
)
,
n
=
a
n
−
(
2
j
+
1
)
+
1
,
n
−
1
=
a
n
n
−
(
2
n
−
2
j
−
1
)
j
−
1
a_{n-(2j+1),n}=a_{n-(2j+1)+1,n}-1=a_{nn}-(2n-2j-1)j-1
an−(2j+1),n=an−(2j+1)+1,n−1=ann−(2n−2j−1)j−1
a
n
,
n
−
(
2
j
+
1
)
=
a
n
,
n
−
(
2
j
+
1
)
)
−
1
−
1
=
a
n
n
+
(
2
n
−
2
j
−
1
)
(
j
+
1
)
−
1
a_{n,n-(2j+1)}=a_{n,n-(2j+1))-1}-1=a_{nn}+(2n-2j-1)(j+1)-1
an,n−(2j+1)=an,n−(2j+1))−1−1=ann+(2n−2j−1)(j+1)−1
所以由观察:
a
n
−
(
2
j
+
1
)
−
i
,
n
−
i
=
a
n
−
(
2
j
+
1
)
+
1
,
n
−
1
−
i
=
a
n
n
−
(
2
n
−
2
j
−
1
)
j
−
i
−
1
a_{n-(2j+1)-i,n-i}=a_{n-(2j+1)+1,n}-1-i=a_{nn}-(2n-2j-1)j-i-1
an−(2j+1)−i,n−i=an−(2j+1)+1,n−1−i=ann−(2n−2j−1)j−i−1
a
n
−
i
,
n
−
(
2
j
+
1
)
−
i
=
a
n
,
n
−
(
2
j
+
1
)
−
1
−
1
−
i
=
a
n
n
+
(
2
n
−
2
j
−
1
)
(
j
+
1
)
−
i
−
1
a_{n-i,n-(2j+1)-i}=a_{n,n-(2j+1)-1}-1-i=a_{nn}+(2n-2j-1)(j+1)-i-1
an−i,n−(2j+1)−i=an,n−(2j+1)−1−1−i=ann+(2n−2j−1)(j+1)−i−1
n为偶数,如:
16
15
7
6
2
1
26
17
14
8
5
3
27
25
18
13
9
4
33
28
24
19
12
10
34
32
29
23
20
11
36
35
31
30
22
21
\begin{matrix}16&15&7&6&2&1\\26&17&14&8&5&3\\27&25&18&13&9&4\\33&28&24&19&12&10\\34&32&29&23&20&11\\36&35&31&30&22&21\\\end{matrix}
162627333436151725283235714182429316813192330259122022134101121
同理,计算得出:
a
11
=
1
2
(
n
2
−
n
+
2
)
a_{11}=\frac{1}{2}(n^2-n+2)
a11=21(n2−n+2)
a
1
+
i
,
2
j
+
1
+
i
=
a
11
−
(
2
n
−
2
j
−
1
)
j
+
i
a
2
j
+
1
+
i
,
1
+
i
=
a
11
+
(
2
n
−
2
j
+
1
)
j
+
i
a
1
+
i
,
1
+
(
2
j
+
1
)
+
i
=
a
11
−
(
2
n
−
2
j
−
1
)
j
−
i
−
1
a
1
+
(
2
j
+
1
)
+
i
,
1
+
i
=
a
11
+
(
2
n
−
2
j
−
1
)
(
j
+
1
)
−
i
−
1
a_{1+i,2j+1+i}=a_{11}-(2n-2j-1)j+i\\a_{2j+1+i,1+i}=a_{11}+(2n-2j+1)j+i\\a_{1+i,1+(2j+1)+i}=a_{11}-(2n-2j-1)j-i-1\\a_{1+(2j+1)+i,1+i}=a_{11}+(2n-2j-1)(j+1)-i-1
a1+i,2j+1+i=a11−(2n−2j−1)j+ia2j+1+i,1+i=a11+(2n−2j+1)j+ia1+i,1+(2j+1)+i=a11−(2n−2j−1)j−i−1a1+(2j+1)+i,1+i=a11+(2n−2j−1)(j+1)−i−1
由此可以写出C语言代码。
C语言代码
#include<stdio.h>
int main()
{
int a[15][15];
int pri,i,j,n;
printf("输入阶数n:\n");
scanf("%d",&n); printf("\n");
pri=(n*n-n+2)/2;
if(n%2==0)
{
a[0][0]=pri;
for(j=0;j<=(n-2)/2;j++)
{
for(i=0;i<=n-2*j-1;i++)
{
/*对角线{a[0][0],a[n-1][n-1]},{a[0][2],a[n-3][n-1]}……斜线上的a[i][2*j+i]的值*/
a[i][2*j+i]=a[0][0]-(2*n-2*j-1)*j+i;
/*对角线{a[0][0],a[n-1][n-1]},{a[2][0],a[n-1][n-3]}……斜线上的a[2*j+i][i]的值*/
a[2*j+i][i]=a[0][0]+(2*n-2*j+1)*j+i;
}
for(i=0;i<=n-2*j-2;i++)
{
/*对角线{a[0][1],a[n-2][n-1]},{a[0][3],a[n-4][n-1]}……斜线上的a[i][2*j+1+i]的值*/
a[i][2*j+1+i]=a[0][0]-(2*n-2*j-1)*j-i-1;
/*对角线{a[1][0],a[n-1][n-2]},{a[3][0],a[n-1][n-4]}……斜线上的a[i][2*j+1+i]的值*/
a[1+2*j+i][i]=a[0][0]+(2*n-2*j-1)*(j+1)-i-1;
}
}
}
else
{
a[n-1][n-1]=pri;
for(j=0;j<=(n-1)/2;j++)
{
for(i=0;i<=n-2*j-1;i++)
{
/*对角线{a[0][0],a[n-1][n-1]},{a[0][2],a[n-3][n-1]}……斜线上的a[i][2*j+i]的值*/
a[n-2*j-i-1][n-i-1]=a[n-1][n-1]-(2*n-2*j-1)*j+i;
/*对角线{a[0][0],a[n-1][n-1]},{a[2][0],a[n-1][n-3]}……斜线上的a[2*j+i][i]的值*/
a[n-i-1][n-2*j-i-1]=a[n-1][n-1]+(2*n-2*j+1)*j+i;
}
for(i=0;i<=n-2*j-2;i++)
{
/*对角线{a[0][1],a[n-2][n-1]},{a[0][3],a[n-4][n-1]}……斜线上的a[i][2*j+1+i]的值*/
a[n-2*j-2-i][n-i-1]=a[n-1][n-1]-(2*n-2*j-1)*j-i-1;
/*对角线{a[1][0],a[n-1][n-2]},{a[3][0],a[n-1][n-4]}……斜线上的a[i][2*j+1+i]的值*/
a[n-i-1][n-2*j-2-i]=a[n-1][n-1]+(2*n-2*j-1)*(j+1)-i-1;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
C语言初学者。