Кто-нибудь может предложить мне лучший / более короткий метод для этого шаблона? - PullRequest
1 голос
/ 08 апреля 2020

4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4

Я хочу более короткий код или более умный код для этого шаблона. Мой код работает нормально, но он немного длинный.

МОЙ КОД

#include <stdio.h>
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=n;i>=1;i--)
    {
        for(j=n;j>i;j--)
        {
            printf("%d ",j);
        }
        for(j=1;j<(2*i)-1;j++)
        {
            printf("%d ",i);
        }
        for(j=i;j<=n;j++)
        {
            printf("%d ",j);
        }
        printf("\n");
    }
    for(i=2;i<=n;i++)
    {
        for(j=n;j>i;j--)
        {
            printf("%d ",j);
        }
        for(j=1;j<(2*i)-1;j++)
        {
            printf("%d ",i);
        }
        for(j=i;j<=n;j++)
        {
            printf("%d ",j);
        }
        printf("\n");
    }

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Примерно так:

#include <stdio.h>
#include <stdlib.h>

int max (int a, int b) {
    return a > b ? a : b;
}

void pattern (int width) {
    int count = width;
    int digits = 1;
    while (count /= 10)
        ++digits;

    for (int line = 0; line < (2*width-1); ++line) {
        for (int col = 0; col < (2*width-1); ++col) {
            int val = max (abs (1+line-width)+1, abs (1+col-width)+1);
            if (col > 0)
                putc (' ', stdout);
            printf ("%*d", digits, val);
        }
        puts ("");
    }
}

int main (int argc, char* argv []) {
    int width = argc > 1 ? atoi (argv [1]) : 4;
    pattern (width);
}

Идея состоит в том, чтобы l oop пройти через все позиции, вычислить расстояние до средней позиции в направлениях X и Y и взять максимум из этого.

1 голос
/ 08 апреля 2020

Могу предложить следующее решение. Наслаждайтесь!:)

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main()  
{ 
    while ( 1 ) 
    { 
        printf( "Enter a non-negative number (0 - exit): " ); 

        int n; 

        if ( ( scanf( "%d", &n ) != 1 ) || ( n <= 0 ) ) break; 

        if ( INT_MAX / 2 < n )  
        { 
            n = INT_MAX / 2; 
        } 

        int width = 1; 

        for ( int tmp = n; tmp /= 10; ) ++width; 

        putchar( '\n' ); 

        int m = 2 * n - 1; 

        for ( int i = 0; i < m; i++ ) 
        { 
            for ( int j = 0; j < m; j++ ) 
            {
                int value1 = abs( n - i - 1 ) + 1;
                int value2 = abs( n - j - 1 ) + 1;

                printf( "%*d ", width, value1 < value2 ? value2 : value1 );
            } 
            putchar( '\n' ); 
        } 

        putchar( '\n' ); 
    } 

    return 0; 
 }

Вывод программы может выглядеть так:

Enter a non-negative number (0 - exit): 10

10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 
10  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9 10 
10  9  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  9 10 
10  9  8  7  7  7  7  7  7  7  7  7  7  7  7  7  8  9 10 
10  9  8  7  6  6  6  6  6  6  6  6  6  6  6  7  8  9 10 
10  9  8  7  6  5  5  5  5  5  5  5  5  5  6  7  8  9 10 
10  9  8  7  6  5  4  4  4  4  4  4  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  3  3  3  3  3  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  3  2  2  2  3  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  3  2  2  2  3  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  3  3  3  3  3  4  5  6  7  8  9 10 
10  9  8  7  6  5  4  4  4  4  4  4  4  5  6  7  8  9 10 
10  9  8  7  6  5  5  5  5  5  5  5  5  5  6  7  8  9 10 
10  9  8  7  6  6  6  6  6  6  6  6  6  6  6  7  8  9 10 
10  9  8  7  7  7  7  7  7  7  7  7  7  7  7  7  8  9 10 
10  9  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  9 10 
10  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9 10 
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 

Enter a non-negative number (0 - exit): 0

На самом деле используются только два цикла, которые выводят сам шаблон.

for ( int i = 0; i < m; i++ ) 
{ 
    for ( int j = 0; j < m; j++ ) 
    {
        int value1 = abs( n - i - 1 ) + 1;
        int value2 = abs( n - j - 1 ) + 1;

        printf( "%*d ", width, value1 < value2 ? value2 : value1 );
    } 
    putchar( '\n' ); 
}
...