输入一个数n,输出n阶矩阵图形:
思路:
当n为偶数时,该图形可看成打印出n/2个数字圈;当n为奇数时,该图形打印还需再打印中间数,即n的平方。在循环里根据下标规律依次打印横向和竖向一圈数字,最后输出结果。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n,i,j,t=1;
int a[100][100];
scanf("%d",&n);
for(i=0;i<n/2;i++) //需要打印n/2圈数
{
for(j=i;j<n-i;j++) //横向、正向打印
a[i][j]=t++;
for(j=i+1;j<n-i;j++) //竖向、正向打印
a[j][n-i-1]=t++;
for(j=n-2-i;j>=i;j--) //横向、逆向打印
a[n-1-i][j]=t++;
for(j=n-2-i;j>=i+1;j--) //竖向、逆向打印
a[j][i]=t++;
}
if(n%2!=0)
a[n/2][n/2]=n*n;//n为奇数时循环无法打印中间的数,中间数应为n的平方
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
另一种更优方法:
#include <stdio.h>
#include <stdlib.h>
#define max 20
int a[max][max];//定义数组最大范围
int main(int argc, char *argv[]) {
int i,j,n;
int t=0;
scanf("%d",&n);
a[n][n]=t;//将数组内所有数置0
t=a[i=0][j=0]=1;//将数组第一个数赋值1,并将其赋值给t
while(t<n*n) //第一个数已填入,故执行n平方-1次
{
while(j+1<n&&!a[i][j+1])//!a[i][j+1]即a[i][j+1]==0
a[i][++j]=++t; //向右查找,若下一个数未到边界且该位置数未被修改,则填入++t
while(i+1<n&&!a[i+1][j])//向下
a[++i][j]=++t;
while(i-1>=0&&!a[i-1][j])//向左
a[--i][j]=++t;
while(j-1>=0&&!a[i][j-1])//向上
a[i][--j]=++t;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}