C# Hollow Number Diamond Pattern

Beginner
5 min read
Updated: Sep 2026
3 programs
Live preview

What Is This Pattern?

A diagonal mirror number diamond is Program 57’s inverse-V pyramid plus a mirrored bottom half — digit i only on the left and right diagonals, spaces everywhere else.

Remember
Rule: top i = 1..rows, bottom i = rows−1..1
      same left/right diagonal print as Program 57

    1
   2 2
  3   3
 4     4
5       5
 4     4
  3   3
   2 2
    1     ← rows = 5 (9 lines)

In C# reuse the same diagonal row logic twice: climb 1..rows, then descend rows-1..1, then WriteLine() after each row.

How to Solve It

Reuse Program 57’s diagonal row logic twice: climb 1..rows, then descend rows-1..1 so the peak line appears once.

MethodIdeaBest for
Two outer loopsTop 1..rows, bottom rows-1..1Learning, interviews, exams
Rows inputSame logic with a user-chosen half-heightPractice / demos

Pseudocode

Pseudocode
function print_row(i, rows):
    for j from rows down to 1:
        if i == j: print i else print space
    for k from 2 to rows:
        if i == k: print i else print space
    print newline

for i from 1 to rows:
    print_row(i, rows)
for i from rows - 1 down to 1:
    print_row(i, rows)

Cheat sheet

GoalPattern
Top halffor (i = 1; i <= rows; i++)
Bottom halffor (i = rows - 1; i >= 1; i--)
Left diagonalfor (j = rows; j >= 1; j--) Console.Write(i == j ? j.ToString() : " ");
Right diagonalfor (k = 2; k <= rows; k++) Console.Write(i == k ? k.ToString() : " ");
Total lines2 * rows - 1

Write vs WriteLine

APIEffectUse for
Console.WriteStays on the same lineEach diagonal digit or filler space
Console.WriteLineEnds the current lineAfter both left and right loops

Live Preview

Change the half-height and the hollow diamond updates instantly — capped at 9 for readable single-digit demos.

Whole numbers from 1 to 9. Tap a chip or type a value — the preview redraws as you go.

Live result rows = 5 · 9 lines
    1    
   2 2   
  3   3  
 4     4 
5       5
 4     4 
  3   3  
   2 2   
    1    

Worked Walkthrough — rows = 5

See how the two outer loops share one row body and why the bottom starts at rows - 1.

Halfi valuesLines produced
Top1..51 → 2 2 → … → 5
Bottom4..14 → 3 3 → … → 1

Total lines = 2×5−1 = 9. Starting the bottom at 5 would print the peak twice.

C# Programs

Three complete programs: fixed rows = 5, user-input half-height, and a compact rows = 3 demo. Use View Output for sample results.

Example 1 — Fixed rows = 5

Hard-coded half-height — top pyramid, then mirrored bottom with the same diagonal logic.

C#
using System;

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int rows = 5;
            int i, j, k;

            for (i = 1; i <= rows; i++)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }

            for (i = rows - 1; i >= 1; i--)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Top half. Same as Program 57: left j = rows..1, right k = 2..rows.

2. Bottom half. Replay the same row body for i = rows - 1 down to 1.

3. One peak. Skipping i = rows on the way down keeps the middle line unique.

Example 2 — User Input (rows)

Read the half-height and draw the same hollow diagonal diamond.

C#
using System;

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int rows, i, j, k;

            Console.Write("Enter the number of rows: ");
            if (!int.TryParse(Console.ReadLine(), out rows) || rows < 1)
            {
                Console.WriteLine("Please enter a positive whole number.");
                return;
            }

            for (i = 1; i <= rows; i++)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }

            for (i = rows - 1; i >= 1; i--)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Validate rows. TryParse rejects non-numeric input; require rows >= 1.

2. Same core. Top and bottom loops match Example 1 — only rows comes from the user.

3. Single-digit tip. Cap demos at rows ≤ 9 so every digit stays one character wide.

Example 3 — Compact rows = 3

Five-line diamond — easy to confirm the bottom starts at 2, not 3.

C#
using System;

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int rows = 3;
            int i, j, k;

            for (i = 1; i <= rows; i++)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }

            for (i = rows - 1; i >= 1; i--)
            {
                for (j = rows; j >= 1; j--)
                    Console.Write(i == j ? j.ToString() : " ");

                for (k = 2; k <= rows; k++)
                    Console.Write(i == k ? k.ToString() : " ");

                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Five lines. Top prints 1, 2 2, 3 3; bottom reprints 2 2 and 1.

2. Trace on paper. Confirm the peak 3 3 appears once — bottom starts at rows - 1.

Edge Cases & Pitfalls

Check these before calling the solution done.

i = rows..1

Double peak

If the bottom loop starts at rows, the widest line prints twice. Always start at rows - 1.

k = 1

Triple digit on a row

If the right loop starts at 1, the center column can print a third digit. Keep k = 2.

WriteLine

Broken rows

If WriteLine sits inside an inner loop, each character lands on its own line. Call it only after both diagonal loops finish.

rows = 1

Single line

Output is just 1 — the bottom loop (rows-1..1) does not run.

rows > 9

Multi-digit width

Digits 10+ break neat column alignment. Cap demos at 9 or use a fixed field width.

Bad input

Convert.ToInt32 throws

Prefer int.TryParse so non-numeric input does not crash the program.

Time and Space Complexity

ProgramTimeExtra space
Fixed / compact (Examples 1, 3)O(n²)O(1)
User input (Example 2)O(n²)O(1)

You print 2n−1 lines, each scanning about 2n−1 positions → O(n²) time. Only a few loop variables are needed.

Key Takeaways

  • Pyramid + mirror: top 1..rows, bottom rows-1..1, same diagonal row body.
  • Skip the peak twice: bottom starts at rows - 1.
  • Write vs WriteLine: digits and spaces stay on the line; WriteLine advances after both loops.
  • Next step: Program 59 prints consecutive numbers around a hollow square border.

One line: Program 57 once upward, then again from rows-1 down to 1.

Frequently Asked Questions

Each row prints the same digit on the left diagonal and the right diagonal; spaces fill the remaining positions.
The top half already printed the peak row — starting at rows-1 avoids duplicating the middle line.
An inverse-V pyramid from 1 to rows, then mirrored back down to 1 — 2*rows-1 lines total.
Program 57 prints only the top pyramid half. Program 58 adds a second outer loop from rows-1 down to 1 for the bottom half.
Each column prints either the row digit or a space — those conditions pick exactly the two diagonal positions.
Change rows or read it from user input with TryParse — see Example 2.
O(n²) for n rows because you print 2n-1 lines, each scanning about 2n positions.
Yes. Replace Console.Write(j) / Console.Write(k) with Console.Write('*') in both diagonal print branches.
Prefer int.TryParse(Console.ReadLine(), out rows) so bad input does not throw FormatException.
Only one line prints — the bottom loop (rows-1..1) does not run.

Did you know?

Print the Program 57 pyramid for the top half, then mirror with for (i = rows-1; i >= 1; i--). Total lines = 2×rows-1 — each row scans about 2×rows-1 positions.

Next: Hollow Square Border Numbers

Continue with consecutive numbers around a hollow square border.

Program 59 tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

6 people found this page helpful