C语言 Just need a answer/solution for 2D number array

8yparm6h  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(96)

我可能在这里做了一些总的混乱,但我已经坐在这个问题了几天。到目前为止,我想出了找到相应位置的方法,但它并不安静的权利。
所以很抱歉缺乏信息或解释,希望像你这样的Maven可以帮助我。
基本上用户输入一个整数,然后必须打印出看起来像这样的2D数字数组:

input: 3           input: 4              input: 5
output:            output:               output: 
1 2 6               1  2  6  7            1  2  6  7 15
3 5 7               3  5  8 13            3  5  8 14 16
4 8 9               4  9 12 14            4  9 13 17 22
                   10 11 15 16           10 12 18 21 23
                                         11 19 20 24 25

个字符

smdnsysy

smdnsysy1#

要在矩阵中的每个位置打印的值是矩阵维度、行和列的奇怪函数。要打印的最大值是矩阵维度的平方。若要保持输出列对齐,请根据最大值中的小数位数确定列宽。
下面代码中的神奇计算确定了当前位置位于左下角到右上角的哪个子对角线上。如果位置在左上半部分,则计算当前子对角线上方三角形中的元素的数量,否则计算当前子对角线下方三角形中的元素的数量。然后,它添加当前子对角线内的位置,这取决于该子对角线的数字增加的方向。如果当前位置低于主左下到右上角对角线,则需要从最大值中减去该值。在上述过程的各个步骤中,需要加或减1的一些调整,以获得当前行和列的正确值。
下面的代码实现了上述过程:

#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 width;
    int sep_ch;
    int tl;
    int br;
    int val;
    int max_val;
    int i;
    int j;
    int jj;
    int is_br;

    /* The maximum value to be printed is the square of x. */
    max_val = x * x;
    /* Determine the number of decimal digits in the maximum value. */
    val = max_val;
    width = 1;
    while (val > 9)
    {
        width++;
        val /= 10;
    }
    /* Do each row. */
    for (i = 1; i <= x; i++)
    {
        /* Initialize magical top-left and bottom-right numbers for each row. */
        tl = i - 1;
        br = x + x - tl;
        /* Do each column. */
        for (j = 1; j <= x; j++)
        {
            /* Adjust magical top-left and bottom right numbers. */
            tl++;
            br--;
            is_br = (tl > br);
            if (is_br)
            {
                /* Bottom-right part. */
                val = br;
                jj = x - j + 1;
            }
            else
            {
                /* Top-left part. */
                val = tl;
                jj = j;
            }
            /* Alternate the direction for magical diagonal stuff. */
            if (val % 2)
            {
                val = val * (val - 1) / 2 + jj;
            }
            else
            {
                val = (val + 1) * val / 2 + 1 - jj;
            }
            if (is_br)
            {
                /* Adjustment for bottom-right part. */
                val = max_val - val + 1;
            }
            sep_ch = j < x ? ' ' : '\n';
            printf("%*d%c", width, val, sep_ch);
        }
    }
}

字符串
printf说明符"%*d%c"中,*为随后的转换指定字段宽度(d)由int类型的参数设置,因此整个"%*d%c"说明符期望*字段宽度为intd转换为intint用于c转换。

示例

输入:

11


输出量:

相关问题