A shrinking repeating number pattern prints digit i repeated rows - i + 1 times, counting i up from 1 so each row gets shorter.
Remember
Rule: for i = 1..n, print i exactly (n - i + 1) times
11111
2222
333
44
5 ← 5 rows
In C# you solve it with two nested for loops: the outer loop picks the digit, the inner loop runs from i to rows with Console.Write, then WriteLine() ends the row. Program 11 is the inverted twin (55555, 4444, 333…).
Approach
How to Solve It
Two ways to emit the same shape — start with nested loops, then optionally shorten with new string.
Method
Idea
Best for
Nested loops
Outer picks digit 1..n; inner runs i..n so width shrinks
Learning, interviews, exams
new string
Build a whole repeated-digit row in one call
Shorter demos once loops click
Pseudocode
Pseudocode
for i from 1 to rows:
for j from i to rows:
print i (no newline)
print newline
Cheat sheet
Goal
Pattern
Pick digit (count up)
for (i = 1; i <= rows; i++)
Shrink repeats
for (j = i; j <= rows; j++) Console.Write(i);
End the row
Console.WriteLine();
One-line row shortcut
Console.WriteLine(new string(i.ToString()[0], rows - i + 1));
Inverted twin (Program 11)
for (i = rows; i >= 1; i--) with Write(i) × i
Write vs WriteLine
API
Effect
Use for
Console.Write
Stays on the same line
Each repeat of digit i
Console.WriteLine
Ends the current line
After the inner loop
Try it
Live Preview
Change the row count and the shrinking pattern 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 result5 rows · 15 digits
11111
2222
333
44
5
Trace
Worked Walkthrough — rows = 4
Trace each outer-loop value of i, how many times the inner loop runs, and the printed row.
i
Inner j
Repeats
Printed row
1
1..4
4
1111
2
2..4
3
222
3
3..4
2
33
4
4..4
1
4
Total digits are 4+3+2+1 = 10 — the triangular number n(n+1)/2.
Code
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 counts up; inner loop runs from i to rows so each row shrinks.
C#
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
int rows = 5;
int i, j;
for (i = 1; i <= rows; i++)
{
for (j = i; j <= rows; j++)
{
Console.Write(i);
}
Console.WriteLine();
}
}
}
}
Output
11111
2222
333
44
5
How It Works
1. Count up.for (i = 1; i <= rows; i++) yields 1, 2, 3, 4, 5 — the digit for each row.
2. Shrink width. When i = 1, the inner loop runs five times (11111); when i = 5, just once (5).
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 = 1; i <= rows; i++)
{
for (j = i; j <= rows; j++)
{
Console.Write(i);
}
Console.WriteLine();
}
}
}
}
2. Same nested loops. Four rows start at 1111 and end at 4.
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 = 1; i <= rows; i++)
{
Console.WriteLine(new string(i.ToString()[0], rows - i + 1));
}
}
}
}
Output
11111
2222
333
44
5
How It Works
1. Repeat a char.new string(i.ToString()[0], rows - i + 1) builds a string of the digit character repeated the right count.
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 = 1; j <= i; j++)
That grows repeats (1, 22, 333 — Program 9). Keep j from i to rows so width shrinks.
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.
wrong start
j = 1 instead of j = i
Starting at 1 every time makes every row length rows — you get a rectangle, not a shrinking triangle.
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.
Analysis
Time and Space Complexity
Program
Time
Extra 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.
Remember
Key Takeaways
Rule: for i = 1..n, print digit i exactly n - i + 1 times.
Inner bound:j from i to rows shrinks the width as the digit grows.
Write vs WriteLine: repeats stay on the line; WriteLine advances after each row.
Next step: Program 13 introduces an alternating zigzag number triangle.
One line: for each digit from 1 to n, print it n-i+1 times with Write, then WriteLine.
Frequently Asked Questions
The inner loop runs from j = i to rows. As i increases (1, 2, 3, …), the inner loop runs fewer times, so each row prints fewer copies of the row digit.
On the first row, i = 1 and the inner loop runs from 1 to rows, so it prints 1 exactly rows times — five 1s when rows = 5.
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.
Use the inner loop as 1..i instead of i..rows so the repeat count grows (see Program 9).
Program 11 counts the outer loop down and repeats digit i exactly i times (55555, 4444, 333, 22, 1). Program 12 counts up and uses for (j = i; j <= rows; j++) so digit i repeats rows - i + 1 times (11111, 2222, 333, 44, 5).
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], rows - i + 1)) 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 rows − i + 1 times. The outer loop counts up from 1, while the inner loop starts at i and runs to rows, so each row shrinks — still O(n²) total prints.