输出特定数组

要求输出下列形式的数组:

12345
161718196
152425207
142322218
131211109
现在任意给一个N*N的数组,按以上方式输出。

这里,先暂时考虑N=5的情况。

从最外一层开始,即从下表的红色加粗数字所示:

12345
161718196
152425207
142322218
131211109
                            表1

然后再往里一层,即从下表的红色加粗数字所示:

12345
161718196
152425207
142322218
131211109
                            表2

然后再往里一层,即从下表的红色加粗数字所示:

12345
161718196
152425207
142322218
13121110

9

                            表3

假定数组为a[N+1][N+1]

分析表1:

当i=1

for(j=1;j<N;j++)

    a[1][j]=0*(N-1)+j;//这是数字1、2、3和4的输出

for(j=1;j<N;j++)

    a[j][N]=1*(N-1)+j;//这是数字5、6、7和8的输出

for(j=1;j<N;j++)

    a[N][N-j+1]=2*(N-1)+j;//这是数字9、10、11和12的输出

for(j=1;j<N;j++)

    a[N-j+1][1]=3*(N-1)+j;//这是数字13、14、15和16的输出

分析表2:

i=2

for(j=1;j<N-2;j++)

    a[2][j+1]=base+0*(N-3)+j;//这是数字17和18的输出,其中base=16,表示上一轮已经输出的数字的总个数

for(j=1;j<N-2;j++)

    a[j+1][N-1]=base+1*(N-3)+j;//这是数字19和20的输出,其中base=16,表示上一轮已经输出的数字的总个数

for(j=1;j<N-2;j++)

    a[N-1][(N-1)-j+1]=base+2*(N-3)+j;//这是数字21和22的输出,其中base=16,表示上一轮已经输出的数字的总个数

for(j=1;j<N-3;j++)

    a[(N-1)-j+1][2]=base+3*(N-3)+j;//这是数字23和24的输出,其中base=16,表示上一轮已经输出的数字的总个数

如果N=5,最后一轮输出25,单独处理。

现在进行整合:

i=1:

for(j=1;j<N;j++)

{

    a[1][j]=0*(N-1)+j;//这是数字1、2、3和4的输出

    a[j][N]=1*(N-1)+j;//这是数字5、6、7和8的输出

    a[N][N-j+1]=2*(N-1)+j;//这是数字9、10、11和12的输出

    a[N-j+1][1]=3*(N-1)+j;//这是数字13、14、15和16的输出

}

i=2:

for(j=1;j<N-2;j++)

{

    a[2][j+1]=base+0*(N-3)+j;//这是数字17和18的输出,其中base=16,表示上一轮已经输出的数字的总个数

    a[j+1][N-1]=base+1*(N-3)+j;//这是数字19和20的输出,其中base=16,表示上一轮已经输出的数字的总个数

    a[N-1][(N-1)-j+1]=base+2*(N-3)+j;//这是数字21和22的输出,其中base=16,表示上一轮已经输出的数字的总个数

    a[(N-1)-j+1][2]=base+3*(N-3)+j;//这是数字23和24的输出,其中base=16,表示上一轮已经输出的数字的总个数

}

最后合成一个(最后一个数字单独处理):

for(i =1; i <= N/2; i++)
    {
        for(j=1; j < N-2*i+2; j++)
        {
            a[i][j+i-1]=base[i-1]+0*(N-(2*i-1))+j;
            a[j+i-1][N-(i-1)] = base[i-1]+1*(N-(2*i-1))+j;
            a[N-(i-1)][(N-(i-1))-j+1] = base[i-1]+2*(N-(2*i-1))+j;
            a[(N-(i-1))-j+1][i] = base[i-1]+3*(N-(2*i-1))+j;
        }
    }

最后一个数字单独处理如下:

a[1+N/2][1+N/2]=ipBase[N/2]+1;

当N=5的时候,base数组如下:

int base[3] = {0, 16, 24};

更一般的:

    int *ipBase = (int *)malloc(sizeof(int)*(1+N/2));
    *(ipBase)=0;
    for(i = 1; i < 1+N/2; i++)
    {
        int iTempSum = 0;
        for(j = 1 ; j <= i; j++)
        {
            iTempSum = iTempSum + 4*(N-2*j+1);
        }
        *(ipBase+i)=iTempSum;
    }

这里base数组为什么有3个元素,而且为什么他们的值是[0,16,24]?

可以认为输出了3次,每次对应一圈数字,如上的3个表。

在输出表1中红色粗体数字1-16的时候,之前的输出的数字总个数为0;

在输出表2中红色粗体数字17-24的时候,之前的输出的数字总个数为16=0+4*(N-1);

在输出表3中红色粗体数字25的时候,之前的输出的数字总个数为24=16+4*(N-3)=0+4*(N-1)+4*(N-3);

同理当N=7的时候base数组的值如下:

base[4]={0,24,40,48}。

base[0]=0;

base[1]=24=0+4*(N-1);

base[2]=40=24+4*(N-3)=0+4*(N-1)+4*(N-3);

base[3]=48=40+4*(N-5)=24+4*(N-3)+4*(N-5)=0+4*(N-1)+4*(N-3)+4*(N-5);

看规律就能得出以上循环方式。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int iDemension;
	printf("Input the demension of the array:");
	scanf("%d", &iDemension);

	int i,j;
	int **a = (int **)malloc(sizeof(int *)*(iDemension+1));
	for(i = 0; i < iDemension+1; i++)
	{
		*(a+i) = (int *)malloc(sizeof(int)*(iDemension+1));
	}

	int N=iDemension;
	for(i = 0; i <=N; i++)
		for(j = 0; j <=N; j++)
			a[i][j]=0;
	

	//int base[3] = {0, 16, 24};
	int *ipBase = (int *)malloc(sizeof(int)*(1+N/2));
	*(ipBase)=0;
	for(i = 1; i < 1+N/2; i++)
	{
		int iTempSum = 0;
		for(j = 1 ; j <= i; j++)
		{
			iTempSum = iTempSum + 4*(N-2*j+1);
		}
		*(ipBase+i)=iTempSum;
	}

	for(i =1; i <= N/2; i++)
	{
		for(j=1; j < N-2*i+2; j++)
		{
			a[i][j+i-1]=ipBase[i-1]+0*(N-(2*i-1))+j;
			a[j+i-1][N-(i-1)] = ipBase[i-1]+1*(N-(2*i-1))+j;
			a[N-(i-1)][(N-(i-1))-j+1] = ipBase[i-1]+2*(N-(2*i-1))+j;
			a[(N-(i-1))-j+1][i] = ipBase[i-1]+3*(N-(2*i-1))+j;
		}
	}
	
	if(0 != N%2)
	{
		a[1+N/2][1+N/2]=ipBase[N/2]+1;
	}
	
	for(int i = 0; i <=N; i++)
	{
		for(int j = 0; j <=N; j++)
		{
			printf("%3d   ", a[i][j]);
		}
		printf("\n");
	}
			
	return 0;
}

等待完善......


版权声明:本文为yangluoli702原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。