压缩矩阵

知识补充:关于等差数列1+2+3+....+n的求和公式
理解1:
	a1=1,d=1,项数为n,求和s(n)=n*a1+1/2*n*(n-1)d
						 =1/2*n*(n+1);
理解2:
	首尾结合,第一项+倒数第一项=n+1;
		 	 第二项+倒数第二项=n+1;
         	 第三项+倒数第三项=n+1;
         	 ......
共有n/2个这样的组合,所以求和s=n/2*(n+1);

1.求对称矩阵存储在一维数组的数组下标

	设数组s下标为k,其中某个元素在二维数组a的数组下标为(i,j),
说明该元素是二维数组的第(i+1)行,第(j+1)列,(两个数组下标均从0开始)。
	则在该元素之前有i行,(对于每一行来说,是第几行就有几个元素),
在该元素之前,有k=1 + 2 + ... + i +j 个元素,
			   k=1/2*i*(i+1)+j
(此时i就相当于等差数列的n,元素为等差数列的第i项)
	该元素在一维数组的位置是第k+1个,下标为k
代码实现:
#include<iostream>
using namespace std;
int main()
{
	int a[5][5] = { 3,6,4,7,8,6,2,8,4,2,4,8,1,6,9,7,4,6,0,5,8,2,9,5,7 };
	int n = 5,k = 0,b[15];
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
		{
			k = i * (i + 1) / 2 + j;
			b[k] = a[i][j];
		}
	for (int i = 0; i < n * (n + 1) / 2; ++i)
		cout << b[i] << " ";
	return 0;
}

全部评论

相关推荐

投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务