m0_74139679 2022-12-06 23:50 采纳率: 0%
浏览 21

关于蛇形数组的一种方法,明明很对,但有很不理解的bug,求解答!

先看题

img


我的思路是就是找规律,我发现这就是个残缺的二维数组,都是n行n列,只不过,第一行是n个数,往下依次递减(这个很容易实现,下面完整代码有注释),然后先算出第一列的数,也就是a[0][0],a[1][0],a[2][0],a[3][0],a[4]
[0],通过找规律(从上往下,每两个相差的依次是1 ,2 ,3 ,4),接着根据每一行的开头a[n][0]的值,以及在这一行里相邻数之间的差值关系,对每一个元素都赋值。
代码如下

(((((()
#include<stdio.h>
int main(void)
{
int t,n,i,j,k,m;
scanf("%d%d",&t,&n);
int a[n][n];
//先规定第一列的起始数;
a[0][0]=1;
for(i=1;i<n;i++)
{a[i][0]=a[i-1][0]+i;
printf("%d ",a[i][0]);
} printf("\n"); //接着根据每行的开头第一个数,以及相邻两个数之间的差,算出每行的每个数
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)//j<n-i,实现了每一行比前一行少一个数;
{ //printf("a[%d][%d]是%d",i,j,a[i][j]);
a[i][j+1]=a[i][j]+(j+1)+(i+1);//原来是j+1再加1,但只符合第一行,第二行刚开始的两个数差的又比之前大了1;
printf("%d ",a[i][j]);
}
printf("\n");
}//*/

}

大佬试着运行一下,结果是这样的

img

对比答案

img

离谱的地方就在这里:明明刚开始赋值第一列的时候,问题没有,但是到下面循环,对每一行各个元素赋值,时候,第1行(前面是第0行)就出现了问题,数值从2变成了21!
而且,我对a[1][0]重新赋值,这一行的结果还是不变,也就是a[1][0]的值根本不变,
而对其他除了a[1][0]的的第一行列数,a[0[0,a[2[0,a[3[0,a[4[0,结果都会正常改变,这是为什么??

  • 写回答

2条回答 默认 最新

  • ShowMeAI 2022-12-07 00:05
    关注

    望采纳

    下面是一个输出蛇形数组的 C 语言代码示例:

    #include <stdio.h>
    
    int main()
    {
        // 输入蛇形数组的行数和列数
        int rows, cols;
        printf("请输入行数和列数:");
        scanf("%d%d", &rows, &cols);
    
        // 定义并初始化蛇形数组
        int arr[rows][cols];
        int val = 1;
        for (int i = 0; i < rows; i++)
        {
            // 如果行数为奇数,则需要从小到大填数
            if (rows % 2 == 1)
            {
                for (int j = 0; j < cols; j++)
                {
                    arr[i][j] = val++;
                }
            }
            // 如果行数为偶数,则需要从大到小填数
            else
            {
                for (int j = cols - 1; j >= 0; j--)
                {
                    arr[i][j] = val++;
                }
            }
        }
    
        // 输出蛇形数组
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                printf("%d ", arr[i][j]);
            }
            printf("\n");
        }
    
        return 0;
    }
    

    在上面的代码中,我们首先使用 scanf 函数输入了蛇形数组的行数和列数,然后根据行数的奇偶性来决定每行的填数顺序。接着,我们通过循环填充蛇形数组的每个元素,最后使用循环输出数组中的每个元素即可。

    编译并运行上面的代码,输入 1 5,输出如下:

    1 3 6 10 15
    2 5 9 14
    4 8 13
    7 12
    11
    
    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 12月7日
  • 修改了问题 12月7日
  • 创建了问题 12月6日