二维转一维数组索引计算异常:需修复NewIndex函数
二维数组转一维数组的索引计算问题修复
问题说明
需将N×N二维数组转换为一维数组,转换规则如下:
- 偶数行(行索引从0开始)仅保留主对角线及上方元素
- 奇数行仅保留主对角线及下方元素
当前代码中NewIndex函数的索引计算逻辑错误,导致转换结果不符合预期,需修复该函数。
原代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 6 int NewIndex(int x, int y) { int j = 0; for (int i = 0; i < x; i++) { j += (i % 2 == 0)? N - i : N - i - 1; } return j + y - x; } void Put(int vec[], int x, int y, int v) { if ((x % 2 == 1 && x < y) || (x % 2 == 0 && x > y)) return; vec[NewIndex(x, y)] = v; } int Get(int vec[], int x, int y) { if ((x % 2 == 1 && x < y) || (x % 2 == 0 && x > y)) return 0; return vec[NewIndex(x, y)]; } void RandArray(int a[N][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i % 2 == 1 && i < j) a[i][j] = 0; else if (i % 2 == 0 && i > j) a[i][j] = 0; else a[i][j] = rand() % 50; } } } void PrintArray(int a[N][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%3i", a[i][j]); } printf("\n"); } } int main() { srand(time(NULL)); int vec[N * 4]; int array[N][N]; RandArray(array); printf("Original Matrix:\n"); PrintArray(array); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { Put(vec, i, j, array[i][j]); } } printf("\n"); for (int i = 0; i < N * 4; i++) printf("%3i", vec[i]); printf("\nSparse Matrix:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%3i", Get(vec, i, j)); } printf("\n"); } return 0; }
当前运行结果
Original Matrix: 19 8 21 23 47 15 39 46 0 0 0 0 0 0 34 2 32 13 44 0 26 36 0 0 0 0 0 0 15 34 33 21 29 45 11 12 19 8 21 23 47 39 46-858993460-858993460-858993460 34 44 0 33 21 29 45 11 12-858993460-858993460-858993460-858993460-858993460 Sparse Matrix: 19 8 21 23 47 39 39 46 0 0 0 0 0 0 34 44 0 33 44 0 33 21 0 0 0 0 0 0 45 11 33 21 29 45 11 12
预期输出
Original Matrix: 19 8 21 23 47 15 39 46 0 0 0 0 0 0 34 2 32 13 44 0 26 36 0 0 0 0 0 0 15 34 33 21 29 45 11 12 19 8 21 23 47 15 39 46 34 2 32 13 44 0 26 36 15 34 33 21 29 45 11 12 Sparse Matrix: 19 8 21 23 47 15 39 46 0 0 0 0 0 0 34 2 32 13 44 0 26 36 0 0 0 0 0 0 15 34 33 21 29 45 11 12
修复方案
原NewIndex函数的错误在于:
- 奇数行的元素数量计算错误,应该是
i+1(从j=0到j=i,共i+1个元素),而非N-i-1 - 奇数行的偏移计算错误,应该直接用
y(从j=0开始存储),而非y-x
修复后的NewIndex函数如下:
int NewIndex(int x, int y) { int idx = 0; for (int i = 0; i < x; i++) { // 累加前x行的有效元素总数 if (i % 2 == 0) { idx += N - i; // 偶数行:主对角线及上方,共N-i个元素 } else { idx += i + 1; // 奇数行:主对角线及下方,共i+1个元素 } } // 计算当前行内的偏移量 if (x % 2 == 0) { return idx + (y - x); // 偶数行从j=x开始,偏移为y-x } else { return idx + y; // 奇数行从j=0开始,偏移为y } }
将原代码中的NewIndex函数替换为上述代码后,即可得到符合预期的转换结果。
内容的提问来源于stack exchange,提问作者Влад
相关产品推荐
相关产品推荐

