不枉风来水顺 发表于 2023-11-13 22:39:19

不会啦!

用C语言完成这个题目呀!!
按要求输出方阵。

输入格式:
为一个正整数n,0<n<10,代表方阵的阶数。

输出格式:
从左上角元素开始,用1到n平方的正整数,按顺时针螺旋方式填充nXn二维数组,见样例(当n=4时)。按行输出所得二维数组。每个整数占两个字符位置右对齐,两个整数之间用一个空格分隔。行末没有空格。

输入样例:
4

输出样例:
1234
12 13 145
11 16 156
10987


我的C代码那有问题呀
#include <stdio.h>

int main() {
    int n, i, j,num = 1, layer;
    int a;
    scanf("%d", &n);
    for (layer = 0; layer < (n + 1) / 2; layer++)
    {
      for (j = layer; j <= n - layer - 1; j++) // 上边
      {
              a = num++;
                }   
      for (i = layer + 1; i <= n - layer - 1; i++) // 右边
      {
              a = num++;
                }   
      for (j = n - layer - 2; j >= layer; j--) // 下边
      {
              a = num++;
                }   
      for (i = n - layer - 2; i > layer; i--) // 左边
      {
              a = num++;
                }   
    }
   
    for (i = 0; i < n; i++)
    {
      for (j = 0; j < n; j++)
      {
            printf("%2d ", a);
      }
      printf("\n");
    }
    return 0;
}

isdkz 发表于 2023-11-13 22:39:31

这段代码的问题在于,它没有正确处理当n为偶数时最后一个中心元素的情况。当n为偶数时,最后一个中心元素不会被正确填充。

为了解决这个问题,我们需要在每一层循环结束后,检查是否还有剩余的中心元素需要填充,并在需要的情况下进行填充。

以下是修改后的代码:

#include <stdio.h>

int main() {
    int n, i, j, num = 1, layer;
    int a;
    scanf("%d", &n);
    for (layer = 0; layer < (n + 1) / 2; layer++) {
      for (j = layer; j <= n - layer - 1; j++) { // 上边
            a = num++;
      }
      for (i = layer + 1; i <= n - layer - 1; i++) { // 右边
            a[ i] = num++;
      }
      for (j = n - layer - 2; j >= layer; j--) { // 下边
            a = num++;
      }
      for (i = n - layer - 2; i > layer; i--) { // 左边
            a[ i] = num++;
      }
    }
    // 处理中心元素
    if (n % 2 == 1) {
      a = num;
    }
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
            printf("%2d ", a[ i]);
      }
      printf("\n");
    }
    return 0;
}


这样修改后的代码会正确处理当n为偶数时的情况,确保中心元素也能被正确填充。
页: [1]
查看完整版本: 不会啦!