vodnasol
vodnasol

Reputation: 21

How to display this pyramid of numbers?

I have this task: A user inputs a number N and you have to output this pyramid:

    0
   101
  21012
 .......
N.21012.N
For N=5 it will be :
     0
    101
   21012
  3210123
 432101234
54321012345

I managed to only get it working for N<10 with this code:

int n;
cin >> n;
for (int i = 0; i < n + 1; i++) {
    for (int j = 0; j < n - i; j++)
        cout << " ";
    int dir = -1;
    for (int k = i; k <= i; k += dir) {
        cout << k;
        if (k == 0)
            dir = 1;
    }
    cout << endl;
}

For N=10 it will look like this :

           0
          101
         21012
        3210123
       432101234
      54321012345
     6543210123456
    765432101234567
   87654321012345678
  9876543210123456789
10987654321012345678910

Upvotes: 0

Views: 416

Answers (4)

vodnasol
vodnasol

Reputation: 21

After the answers I settled on this :

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int main()
{
  int n, spaces;
  string number;
  cin >> n;
  if (n < 10)
    spaces = n;
  else
  {
    spaces = 9;
    int pwr = 0, k = n;
    while (k > 9)
    {
      pwr++;
      k /= 10;
    }
    for (int i = 1; i < pwr; i++)
    {
      spaces += pow(10, i) * 9 * (i + 1);
    }
    spaces += (n - pow(10, pwr) + 1) * (pwr + 1);
  }
  // cout << spaces << endl;
  for (int i = 0; i < n + 1; i++)
  {
    for (int j = i; j > -1; j--)
      number += to_string(j);
    int len = number.length() - 1;
    for (int j = 0; j < spaces - len; j++)
      cout << " ";
    for (int j = 1; j <= i; j++)
      number += to_string(j);
    cout << number << endl;
    number.clear();
  }
  cout << endl;
  return 0;
}

Upvotes: 2

David Hožič
David Hožič

Reputation: 255

Here is the working code:

#include <string>

#include <iostream>

using namespace std;

#define MAX_SPACE 50


int main()
{
    int n;
    cin >> n;

    string output = "";
    for (int i = 0; i < n + 1; i++)
    {
        for (int k = i; k >= 0; k--) {
            output += to_string(k);
        }
        for (int k = 1; k <= i; k++) {
            output += to_string(k);
        }

        for (uint8_t i = 0, max = MAX_SPACE - output.length() / 2.00; i < max; i++) // Print max spaces minus the integer length divided by 2
        {
            cout << " ";
        }
        cout << output << endl; // Print number
        output = "";
    }

    return 0;
}

Upvotes: 0

viraltaco_
viraltaco_

Reputation: 1190

I made this a bit ago Compiler Explorer Not sure if that'd help 🤔

Upvotes: 0

Marek R
Marek R

Reputation: 37697

int padding(int n) {
    constexpr auto singleDigitNumbersCount = 9;
    constexpr auto doubleDigitNumbersCount = 90; // from 10 to 99
    if (n < 10) return n;
    if (n < 100) return 2*n - singleDigitNumbersCount;
    return 3*n - doubleDigitNumbersCount - 2*singleDigitNumbersCount;
}

int main() {
    int n;
    cin >> n;

    for (int i = 0; i < n + 1; i++) {
        std::cout << std::string(padding(n) - padding(i), ' ');
        for (int k = i; k >= 0; k--) {
            cout << k;
        }
        for (int k = 1; k <= i; k++) {
            cout << k;
        }
        cout << '\n';
    }

    return 0;
}

https://godbolt.org/z/EEaeWEvf4

Upvotes: 1

Related Questions