趣味数组(二)

今天,继续讲趣味数组。

1.编程然后请输出这样的一个数组:


这和我们线代中学的上三角矩阵有点类似。我们在处理这个问题时,我们按照层来处理,不是一般的行列。

那么啥是层呢?例如:1就是第一层,2,3 就是第二层,456就是第三层,以此类推。在这里我们可以发现,层号和这个层里面所包含的元素个数是相同的。

设层号是 i,每一层所包含的元素个数为 j。那么,i 的范围是 i∈[1,n], j∈[1,i].

这样我们就能很快的找出每一个元素位置的坐标关系:a[i-j+1][j]

代码如下:

	int a[100][100];//
	int n;
	scanf("%d",&n);
	int i,j;//i层数,j层内元素的个数
	int k=1;
	memset(a,0,sizeof(a));
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=i;j++)
		{
			a[i-j+1][j]=k;	//因为i∈[1,n],j∈[1,i],在这里我们是从左下角斜向上开始,行i减少,列j增加。根据,i和j的关系,每一层元素的个数等于这一层的层数,因此它的关系是i-j+1
			//相当于从i中取j。
			k++;
		}
	}
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=n;j++)
		{
			if (a[i][j]!=0)
			{
				printf("%4d",a[i][j]);
			}	
		}	
		printf("\n");
	}

2.编程然后输出下面的矩阵:



在这里,我们使用上一篇螺旋数组的思路来处理这个问题。

我们可以将这个数组看成这样的:


最外层是有1组成的,次外层是有2组成的,以此类推。

我们也可以将这个数组看成螺旋数组。这个数组分别在圈住的1和2处,改变方向并且数值增加。


数组本来从左上角的1开始螺旋增加,然后在圈住的1开始,数值增加,由1变成2.因此我们只需要将上一篇中螺旋数组的代码修改一下,就能实现这个数组。

代码如下:

	int a[100][100],b[2];
	int k;//每一层有几个数
	int t=1;//t=1在左下角,t=-1在右下角
	int x=1,y,n;
	memset(a,0,sizeof(a));
	b[0]=-1;
	b[1]=0;
	scanf("%d",&n);
	k=n;
	int num=1;

	if (n<3)
	{
		printf("ERROR");
	}
	else
	{
		while(x<=n*n)
		{
			for(y=0;y<2*k-1;y++)
			{
				b[y/k]=b[y/k]+t;
				a[b[0]][b[1]]=num;
				x++;
			}
			k--;	
			if ((k%2!=0)&&(n%2!=0))//输入的是奇数
			{
				num++;
			}
			if ((k%2==0)&&(n%2==0))//输入的是偶数
			{
				num++;
			}
			t=-t;
		}
	}
	for (int i=0;i<100;i++)
	{
		for(int j=0;j<100;j++)
			if (a[i][j])
			{
				printf("%4d",a[i][j]);
			}
			printf("\n");
	}
这个算法还有很高的改进空间,我的这个方法有点笨拙,欢迎各位看官中的大神,给出更加高效的算法。我们一同进步嘛!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值