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

C语言N阶矩阵填充问题求助:对角为0,上三角1~N下三角-1~-N

N×N特殊矩阵生成问题的修复方案

需求明确

  • 生成N×N矩阵,主对角线元素全为0
  • 主对角线上方元素:沿平行于主对角线的方向填充1到N-1(位置(i,j),j>i时,值为j-i)
  • 主对角线下方元素:沿平行于主对角线的方向填充-1到-(N-1)(位置(i,j),i>j时,值为-(i-j))
  • N=5的预期输出:
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0

常见错误排查

1. 索引计数错误

很多开发者习惯用1-based的行列索引(从1开始计数),导致j-i或i-j的结果偏移1,比如本该输出1的位置变成2。修复时需改为0-based索引(从0开始)。

2. 填充逻辑颠倒

误将上方区域的值写成i-j,下方区域写成-(j-i),导致正负或数值完全错误。需严格按照j>i时取j-i,i>j时取-(i-j)的逻辑处理。

3. 循环范围错误

内层循环未覆盖所有列,或条件判断遗漏对角线情况,导致部分元素未正确赋值。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int N;
    printf("输入N值:");
    scanf("%d", &N);

    // 动态分配二维数组,适配任意正整数N
    int **matrix = (int **)malloc(N * sizeof(int *));
    for (int i = 0; i < N; i++) {
        matrix[i] = (int *)malloc(N * sizeof(int));
    }

    // 核心填充逻辑
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j) {
                matrix[i][j] = 0;
            } else if (j > i) {
                matrix[i][j] = j - i;
            } else {
                matrix[i][j] = -(i - j);
            }
        }
    }

    // 格式化打印矩阵
    printf("%d×%d矩阵:\n", N, N);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%4d", matrix[i][j]);
        }
        putchar('\n');
    }

    // 释放动态内存
    for (int i = 0; i < N; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

代码说明

  • 采用动态内存分配,支持任意正整数N(内存允许范围内)
  • 核心逻辑清晰:通过判断行列索引的大小关系,直接计算对应位置的值,避免冗余操作
  • 用%4d格式化输出,保证矩阵对齐美观
  • 包含内存释放步骤,避免内存泄漏

测试验证(N=5)

运行代码输入5,输出如下:

0   1   2   3   4
  -1   0   1   2   3
  -2  -1   0   1   2
  -3  -2  -1   0   1
  -4  -3  -2  -1   0

内容的提问来源于stack exchange,提问作者user19676724

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:01