C# Repeating Number Triangle Pattern (Inverted)

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

What Is This Pattern?

An inverted repeating number triangle prints digit i exactly i times, counting i down from rows so the first row is widest.

Remember
Rule: for i = n..1, print i exactly i times

55555
4444
333
22
1       ← 5 rows

In C# you solve it with two nested for loops: the outer loop picks the digit, the inner loop repeats it with Console.Write, then WriteLine() ends the row. Program 10 is the growing twin (5, 44, 333…).

How to Solve It

Two ways to emit the same shape — start with nested loops, then optionally shorten with new string.

MethodIdeaBest for
Nested loopsOuter picks digit n..1; inner repeats it i timesLearning, interviews, exams
new stringBuild a whole repeated-digit row in one callShorter demos once loops click

Pseudocode

Pseudocode
for i from rows down to 1:
    for j from 1 to i:
        print i (no newline)
    print newline

Cheat sheet

GoalPattern
Pick digit (count down)for (i = rows; i >= 1; i--)
Repeat digit i exactly i timesfor (j = 1; j <= i; j++) Console.Write(i);
End the rowConsole.WriteLine();
One-line row shortcutConsole.WriteLine(new string(i.ToString()[0], i));
Growing twin (Program 10)for (j = rows; j >= i; j--) Console.Write(i);

Write vs WriteLine

APIEffectUse for
Console.WriteStays on the same lineEach repeat of digit i
Console.WriteLineEnds the current lineAfter the inner loop

Live Preview

Change the row count and the inverted triangle updates instantly — including the total digit count.

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

Live result 5 rows · 15 digits
55555
4444
333
22
1

Worked Walkthrough — rows = 4

Trace each outer-loop value of i, how many times the inner loop runs, and the printed row.

iInner jRepeatsPrinted row
41..444444
31..33333
21..2222
11..111

Total digits are 4+3+2+1 = 10 — the triangular number n(n+1)/2.

C# Programs

Three complete programs: fixed height, row-count input, and a new string shortcut. Use View Output for sample results.

Example 1 — Fixed rows = 5

Outer loop picks the digit; inner loop repeats it exactly i times.

C#
using System;

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

            for (i = rows; i >= 1; i--)
            {
                for (j = 1; j <= i; j++)
                {
                    Console.Write(i);
                }
                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Count down. for (i = rows; i >= 1; i--) yields 5, 4, 3, 2, 1 — the digit for each row.

2. Match repeats to digit. When i = 5, the inner loop runs five times (55555); when i = 1, just once (1).

3. Newline. WriteLine() after the inner loop starts the next shorter row.

Example 2 — User Input

Read the row count at runtime. Prefer int.TryParse in real apps so bad input does not throw.

C#
using System;

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

            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 = rows; i >= 1; i--)
            {
                for (j = 1; j <= i; j++)
                {
                    Console.Write(i);
                }
                Console.WriteLine();
            }
        }
    }
}

How It Works

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

2. Same nested loops. Four rows start at 4444 and end at 1.

Example 3 — new string Shortcut

Build each repeated-digit row in one call. Best for single-digit rows (1–9).

C#
using System;

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

            for (int i = rows; i >= 1; i--)
            {
                Console.WriteLine(new string(i.ToString()[0], i));
            }
        }
    }
}

How It Works

1. Repeat a char. new string(i.ToString()[0], i) builds a string of the digit character repeated i times.

2. Same shape. Identical output to Example 1 — keep the two-loop version for exams that ask for both bounds.

Edge Cases & Pitfalls

Check these before calling the solution done.

wrong twin

for (j = rows; j >= i; j--)

That is Program 10 (5, 44, 333…). Keep j from 1 to i so repeats equal the digit.

WriteLine early

WriteLine(i) inside the inner loop

That puts each digit on its own line. Use Write(i); call WriteLine() only after the row finishes.

off-by-one

j < i instead of j <= i

You drop one repeat on every row (e.g. 55555 becomes 5555).

rows = 1

Single digit

Output is just 1 — a good sanity check.

rows ≤ 0

Empty output

The outer loop never runs. Validate and prompt again for clearer UX.

multi-digit

rows > 9

Write(10) prints two characters. Labs usually stick to 1–9; the new string shortcut also assumes a single digit char.

Time and Space Complexity

ProgramTimeExtra space
Nested loops (Examples 1–2)O(n²)O(1)
new string shortcut (Example 3)O(n²)O(n) per row for the built string

There are n rows printing n+(n-1)+…+1 digits, so total work is n(n+1)/2.

Key Takeaways

  • Rule: for i = n..1, print digit i exactly i times.
  • Inner bound: j from 1 to i matches repeats to the digit and shrinks each row.
  • Write vs WriteLine: repeats stay on the line; WriteLine advances after each row.
  • Next step: Program 12 shrinks a different repeating sequence.

One line: for each digit from n down to 1, print it i times with Write, then WriteLine.

Frequently Asked Questions

The outer loop decreases i from rows down to 1, and the inner loop runs j from 1 to i. Row i repeats digit i exactly i times, so the widest row is first and each next row is shorter.
for (j = 1; j <= i; j++) Console.Write(i) runs the inner body i times. When i is 5 you get 55555; when i is 1 you get a single 1.
Console.Write stays on the same line. Console.WriteLine ends the current line. Repeated digits use Write(i); the row break uses WriteLine after the inner loop.
Program 10 grows repeat count as the digit shrinks (5, 44, 333, 2222, 11111) using for (j = rows; j >= i; j--). Program 11 repeats digit i exactly i times (55555, 4444, 333, 22, 1) using for (j = 1; j <= i; j++).
O(n²) where n is the number of rows. Total Console.Write calls equal n+(n-1)+…+1 = n(n+1)/2.
Yes. Console.WriteLine(new string(i.ToString()[0], i)) prints a full single-digit row in one call. Nested loops are better for learning; the string constructor is a handy shortcut later.
Prefer int.TryParse(Console.ReadLine(), out rows) so bad input does not throw FormatException.
The outer loop never runs, so nothing is printed. Validate and prompt again if you want a clear user message.

Did you know?

Row digit i repeats exactly i times. The outer loop counts down from rows, so the first row is widest (rows copies of rows) and each line shortens — still O(n²) total prints.

Next: Shrinking Repeating Pattern

Keep practicing nested loops with a new shrink rule.

Program 12 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.

12 people found this page helpful