今天给大家分享的是对称矩阵的压缩存储,大家都知道,对称矩阵是除了主对角线外,其他的元素一一对应相等,下面大家看看这个代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define ROW 4
#define COL 4
//对称矩阵的压缩存储(行优先存储)
void compress(int arr[ROW][COL], int row, int col)
{
int press[ROW * COL - 6] = { 0 };
int i = 0;
int j = 0;
int k = 0;
//应该从1开始,因为如果从0开始,后面在计算k的时候会覆盖值
for (i = 1; i <= row; i++)
{
for (j = 1; j <= i; j++)
{
if (k < ROW * COL - 6)
{
//k减1的原因是,计算的是此时的这个i,j是第几个元素,然后再数组中表示的就是下标,所以减1
k = (i * (i - 1)) / 2 + j - 1;
//因为是从1开始的,所以要减1对应他的二维数组的下标
press[k] = arr[i - 1][j - 1];
}
}
}
scanf("%d%d", &i, &j);
if (i >= j)
{
k = (i * (i - 1)) / 2 + j - 1;
printf("%d", press[k]);
}
else
{
int swap = i;
i = j;
j = swap;
k = (i * (i - 1)) / 2 + j - 1;
printf("%d", press[k]);
}
}
int main()
{
int arr[ROW][COL] = {
{1,2,3,4},
{2,5,6,7},
{3,6,9,8},
{4,7,8,1},
};
compress(arr, ROW, COL);
return 0;
}
总体思路大概就是选择下三角区域或是上三角区域来存储进一维数组,然后算出此时i,j分别对应的是第几个元素,让算出来的第几个元素减1当做一维数组的下标,一一对应存储就好。sauna他是第几个元素的方法是,假设就拿主对角线下面的来存储,因为第1行有1个元素,第二行2个,所以以此就是 1,2,3,4.....i,总共的元素就是等差数列前n想求和了,求和是应注意的是,如果你想算第i行前面有几个元素,那么先算i-1行的元素,在加j就是此时的这个元素的位置,应为要对应到一维数组中,所以在-1.用图像来解释,如下:
注:i一定要从1开始 ,不然会覆盖数据
最后,如果你学到了这个方法的话,请点一下赞吧!!!!