You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维转一维数组索引计算异常:需修复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函数的错误在于:

  1. 奇数行的元素数量计算错误,应该是i+1(从j=0到j=i,共i+1个元素),而非N-i-1
  2. 奇数行的偏移计算错误,应该直接用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,提问作者Влад

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:53:09