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
相关产品推荐
相关产品推荐

