如何在C中按升序编写此矩阵的算法。我的代码中是否有错误?

时间:2017-04-05 07:33:58

标签: c algorithm

我正在编写此代码,以此螺旋顺序打印以下矩阵(逐列螺旋)。但我的代码打印完全不同。

a     a+7  a+8   a+15
a+1   a+6  a+9   a+14
a+2   a+5  a+10  a+13
a+3   a+4  a+11  a+12

这就是我所做的:

int main() {
    int a;
    int Sum = 0;
    int i = 0, j = 0,n;
    printf("Insert the value of n: ");
    scanf("%d",&n);

    printf("Insert the value of a number: ");
    scanf("%d",&a);

    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d  ",a);
            a = a + 7;
            printf("\t");
        }

        printf("%d",a);
        a = a + 1 ;

        printf("\n");
    }

    return 0;
}

4 个答案:

答案 0 :(得分:4)

我接近这个的方法是构建你真正想要的值矩阵,但是在 column 顺序中这样做,我们可以相对容易地按行控制值进展的逻辑。然后,使用该矩阵,打印出 row 顺序中的值,如您所希望的那样:

int main()
{
    int a = 7;
    int n = 4;
    int array[4][4];

    for (int c=0; c < n; ++c)
    {
        for (int r=0; r < n; ++r)
        {
            // values ascending for even columns
            if (c % 2 == 0)
            {
                array[r][c] = a + c*n + r;
            }
            // values descending for odd columns
            else
            {
                array[r][c] = a + c*n + n-r-1;
            }
        }
    }

    for (int i=0; i < n; ++i)
    {
        for (int j=0; j < n; ++j)
        {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}

<强>输出:

enter image description here

在这里演示:

Rextester

答案 1 :(得分:1)

您可以通过简单的算术随时计算要添加的值,而不是使用此复杂机制来跟踪所有元素。

见这个

int row;
int column;
printf("\n");
for (row = 0; row < n; row++) {
    for (column = 0; column < n; column++) {
        int base; 
        int flag; 
        if (column % 2 != 0) {
            base = (column+1)/2 * 2*n - 1;
            flag = -1;
        }else {
            base = column/2 * 2*n;
            flag = 1;
        }
        printf( "%d ", a + base + flag * row);
    }
    printf("\n");
}

我希望你能够遵循这个逻辑。如果没有随意问。

在这里演示: Ideone

答案 2 :(得分:0)

使用矩阵在打印前计算值的简单解决方案

#include <stdio.h>

int main(void)
{
    int a;
    int i = 0, j = 0, n;
    printf("Insert the value of n: ");
    scanf("%d", &n);

    printf("Insert the value of a number: ");
    scanf("%d", &a);

    int matrix[n][n];

    for (i=0; i< n*n; i++)
    {
        // even columns ascending
        if (((i/n) % 2) == 0)
        {
            matrix[i%n][i/n] = a++;
        }
        // odd column descending
        else
        {
            matrix[n-(i%n)-1][i/n] = a++;
        }
    }

    for (i=0; i< n; i++)
    {
        for (j=0; j< n; j++)
        {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

输出

Insert the value of n: 4
Insert start value: 1
1   8   9   16  
2   7   10  15  
3   6   11  14  
4   5   12  13  

答案 3 :(得分:0)

您的代码似乎存在两个问题。如上面的注释所述,您在循环计算中使用变量a,因此它会不断更新。这意味着您的循环在几次迭代后变得无效。如果定义虚拟变量,则可以避免此问题。其次,螺旋式的实施接近正确,但它并不存在。

考虑案例n = 4。沿每行打印时,新元素与最后一个元素之间的差异在(2n - 1) = 71之间交替显示。要考虑到这一点,您可以检查每次要打印列索引(j)是奇数还是偶数,并使用它来确定要添加的差异。一旦你修好了行机器,就不难将它扩展到列上。