C语言n阶蛇形矩阵输出

这篇博客介绍了如何用C语言编写代码来生成n阶的蛇形矩阵。当n为奇数时,通过数学公式推导出矩阵中各元素的位置关系,并给出了相应的递推公式。同样,对于n为偶数的情况,也进行了分析。文章最后提供了C语言的实现代码,适合C语言初学者学习。
摘要由CSDN通过智能技术生成

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(n1)所以ann=21(n2n+2)
a n − 2 , n = a n n − ( n − 1 ) − ( n − 2 ) a_{n-2,n}=a_{nn}-(n-1)-(n-2) an2,n=ann(n1)(n2) a n − 4 , n = a n − 2 , n − ( n − 3 ) − ( n − 4 ) a_{n-4,n}=a_{n-2,n}-(n-3)-(n-4) an4,n=an2,n(n3)(n4)
推出:
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 an2j,n=ann[(n1)+(n2)++(n2j)]=ann(2n2j1)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 an2ji,ni=ann(2n2j1)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 ani,n2ji=ann+[(n)+(n1)++(n2j+1)]+i=ann+(2n2j+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,n1=ann(2n2j1)j1
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))11=ann+(2n2j1)(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,ni=an(2j+1)+1,n1i=ann(2n2j1)ji1
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 ani,n(2j+1)i=an,n(2j+1)11i=ann+(2n2j1)(j+1)i1

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(n2n+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(2n2j1)j+ia2j+1+i,1+i=a11+(2n2j+1)j+ia1+i,1+(2j+1)+i=a11(2n2j1)ji1a1+(2j+1)+i,1+i=a11+(2n2j1)(j+1)i1
由此可以写出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语言初学者。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值