求助:实现特定填充模式的N阶二维整数数组(C语言)
修正N×N数组特定填充模式的C语言代码
需求描述
输入整数N,输出符合特定填充规则的N×N二维整数数组,原代码逻辑错误无法得到正确结果。
期望输入输出示例
- 输入3时输出:
1 2 6
3 5 7
4 8 9
- 输入4时输出:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
- 输入5时输出:
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
原错误代码
#include <stdio.h> #include <stdlib.h> void SomeFunction(int x); int main(void) { int N; scanf("%d",&N); SomeFunction(N); return 0; } void SomeFunction(int x) { // int array[row][col]; for(int val=1; val<=x*x; val++) { for(int i=1; i<=x; i++) { for(int j=1; j<=x; j++) { for(int k=2; k<=2*x; k++) { if((i+j)==k) printf("%2d ",val); } } printf("\n"); } } }
修正后的代码
#include <stdio.h> #include <stdlib.h> void printPattern(int n); int main(void) { int N; scanf("%d", &N); printPattern(N); return 0; } void printPattern(int n) { int arr[n][n]; int val = 1; // 按i+j的和k遍历,覆盖所有对角线分组 for (int k = 2; k <= 2 * n; k++) { if (k % 2 == 0) { // 偶数和:从下往上填充元素 int start_i = (k - 1) > n ? n : k - 1; int end_i = (k - n) < 1 ? 1 : k - n; for (int i = start_i; i >= end_i; i--) { int j = k - i; arr[i-1][j-1] = val++; // 转换为0起始的数组下标 } } else { // 奇数和:从上往下填充元素 int start_i = (k - n) < 1 ? 1 : k - n; int end_i = (k - 1) > n ? n : k - 1; for (int i = start_i; i <= end_i; i++) { int j = k - i; arr[i-1][j-1] = val++; } } } // 打印最终数组,保持格式对齐 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%2d ", arr[i][j]); } printf("\n"); } }
关键修正说明
- 逻辑重构:原代码多层嵌套循环重复打印值,完全不符合填充规则。修正后先创建数组存储结果,再按规则填充,最后统一打印。
- 填充规则实现:
- 按
i+j的和k分组,覆盖所有数组元素(k从2到2n)。 - 偶数k时,从大到小遍历行索引,实现从下往上填充对角线;奇数k时,从小到大遍历行索引,实现从上往下填充,完全匹配示例中的顺序。
- 按
- 下标处理:C语言数组下标从0开始,循环中使用1起始的i、j时,需转换为0起始的索引(减1)。
- 格式对齐:使用
%2d确保每个元素占2位宽度,输出格式与示例一致。
内容的提问来源于stack exchange,提问作者Ganbold Munkhtur
相关产品推荐
相关产品推荐

