Напишите базовую программу с половиной пирамиды - PullRequest
1 голос
/ 03 июля 2019

Пробовали несколько базовых шаблонов

, пытаясь получить шаблон

1
2 4
3 6 12
4 8 16 32

Так далеко, пытаясь найти правильную последовательность, моя идея в том, что нужна другая переменная, скажем, num, и нужносоздать последовательность для num, чтобы в итоге вывести num

#include <stdio.h>
int main()
{
    int rows = 0  , i, j , num,num2;


   do{
        printf("please enter the number of rows: ");
       scanf("%d",&rows);
    }while(rows <=2 );
    printf("printing a half pyramid of %d rows", rows);
    printf("\n");
     for( i = 1; i <=rows; ++i) {
        for (j = 1; j <= i; ++j ) {

            printf("%d ",  );


        }
       printf("\n");

    }
    return 0;
}

Невозможно определить последовательность

Ответы [ 4 ]

2 голосов
/ 03 июля 2019

Код, который вы дали буквально, содержит все необходимые части. Вам остается только заполнить эту строку внутри вложенного цикла:

printf("%d ", <i>‹what goes here?›</i>);

Чтобы найти ответ, вам необходимо выяснить, как значение соотносится с текущей строкой и столбцом (задайте значения i и j соответственно).

Вам не нужна дополнительная переменная num (для ясности, вы можете создать ее, но для решения этой проблемы нет необходимости).

1 голос
/ 03 июля 2019

Мы, начинающие, должны помогать друг другу. :)

Вот и вы.

#include <stdio.h>

int main(void) 
{
    while ( 1 )
    {
        const unsigned int Base = 10;

        printf( "Enter the height of a pyramid (0 - exit): " );

        unsigned int n;

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

        int width = 0;
        unsigned int tmp = n * n;

        do { ++width; } while ( tmp /= Base );

        putchar( '\n' );

        for ( unsigned int i = 0; i < n; i++ )
        {
            unsigned int value = i + 1;
            for ( unsigned int j = 0; j++ <= i; )
            {
                printf( "%*u ", width, value * j );
            }
            putchar( '\n' );
        }

        putchar( '\n' );
    }

    return 0;
}

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

Enter the height of a pyramid (0 - exit): 1

1 

Enter the height of a pyramid (0 - exit): 2

1 
2 4 

Enter the height of a pyramid (0 - exit): 3

1 
2 4 
3 6 9 

Enter the height of a pyramid (0 - exit): 4

 1 
 2  4 
 3  6  9 
 4  8 12 16 

Enter the height of a pyramid (0 - exit): 5

 1 
 2  4 
 3  6  9 
 4  8 12 16 
 5 10 15 20 25 

Enter the height of a pyramid (0 - exit): 6

 1 
 2  4 
 3  6  9 
 4  8 12 16 
 5 10 15 20 25 
 6 12 18 24 30 36 

Enter the height of a pyramid (0 - exit): 7

 1 
 2  4 
 3  6  9 
 4  8 12 16 
 5 10 15 20 25 
 6 12 18 24 30 36 
 7 14 21 28 35 42 49 

Enter the height of a pyramid (0 - exit): 8

 1 
 2  4 
 3  6  9 
 4  8 12 16 
 5 10 15 20 25 
 6 12 18 24 30 36 
 7 14 21 28 35 42 49 
 8 16 24 32 40 48 56 64 

Enter the height of a pyramid (0 - exit): 9

 1 
 2  4 
 3  6  9 
 4  8 12 16 
 5 10 15 20 25 
 6 12 18 24 30 36 
 7 14 21 28 35 42 49 
 8 16 24 32 40 48 56 64 
 9 18 27 36 45 54 63 72 81 

Enter the height of a pyramid (0 - exit): 0

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

for ( unsigned int i = 0; i++ < n;  )
{
    unsigned int value = i;
    for ( unsigned int j = 0; j < i; j++ )
    {
        printf( "%*u ", width, value );
        value += i;
    }
    putchar( '\n' );
}

или без введения промежуточной переменной value как

for ( unsigned int i = 0; i < n; i++ )
{
    for ( unsigned int j = 0; j++ <= i; )
    {
        printf( "%*u ", width, j * ( i + 1 ) );
    }
    putchar( '\n' );
}

Вы сами можете добавить в программу проверку, что n * n небольше UINT_MAX.

Редактировать: Когда вы изменили отображаемые значения в шаблоне, программа может выглядеть, например, следующим образом

#include <stdio.h>
#include <math.h>

int main(void) 
{
    while ( 1 )
    {
        const unsigned int Base = 10;

        printf( "Enter the height of a pyramid (0 - exit): " );

        unsigned int n;

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

        int width = 0;
        unsigned long long int tmp = n * ( long long unsigned )pow( 2, ( n - 1 ) );

        do { ++width; } while ( tmp /= Base );

        putchar( '\n' );

        for ( unsigned int i = 0; i++ < n;  )
        {
            unsigned int value = i;
            for ( unsigned int j = 0; j < i; j++ )
            {
                printf( "%*u ", width, value );
                value *= 2;
            }
            putchar( '\n' );
        }

        putchar( '\n' );
    }

    return 0;
}

Программавывод может выглядеть как

Enter the height of a pyramid (0 - exit): 10

   1 
   2    4 
   3    6   12 
   4    8   16   32 
   5   10   20   40   80 
   6   12   24   48   96  192 
   7   14   28   56  112  224  448 
   8   16   32   64  128  256  512 1024 
   9   18   36   72  144  288  576 1152 2304 
  10   20   40   80  160  320  640 1280 2560 5120 

Enter the height of a pyramid (0 - exit): 0
0 голосов
/ 05 июля 2019

Хитрый узор. Вот логика для этого шаблона с реализацией. 'n' - количество строк.

#include <stdio.h>
int main(void) {
int n = 4;
    for(int i=1; i<=n; i++) {
        int k=i;
        printf("%d%s",k," ");
        for(int j=1; j<i; j++) {
            k = k*2;
            printf("%d%s",k," ");
        }
        printf("\n");
    }
    return 0;
}
0 голосов
/ 03 июля 2019

Теперь, когда образец для получения должен быть

1
2 4
3 6 12
4 8 16 32

внутренним printf(), если вопрос, вероятно, должен быть:

printf("%d ", i<<(j-1) );

, потому что каждая строка, кажется, содержит row*2**(column-1) (считая от 1).

Умножение на степень два просто заменяется сдвигом в сторону старших бит.

...