A reverse left-growing number triangle always starts each row at the peak digit rows, then counts down farther each time — 5, 54, 543, and so on.
Remember
Rule: for i from rows down to 1
for j from rows down to i: print j (no space)
5
54
543
5432
54321 ← rows = 5
Follows the reverse-row triangle in Program 7; next is the repeating number triangle in Program 9.
Approach
How to Solve It
Outer loop counts down from rows to 1. Inner loop prints digits rows..i. End each row with Console.WriteLine().
Method
Idea
Best for
Descending outer + descending inner
Outer i = rows..1; inner j = rows..i; print j
Learning, interviews, exams
Spaced digits
Console.Write(j + " ") instead of Console.Write(j)
Easier reading on each row
Pseudocode
Pseudocode
for i from rows down to 1:
for j from rows down to i:
print j
print newline
Cheat sheet
Goal
Pattern
Pick each row
for (int i = rows; i >= 1; i--)
Print digits
for (int j = rows; j >= i; j--) Console.Write(j);
End of row
Console.WriteLine();
Spaced form
Console.Write(j + " ");
vs Program 6 / 7
6: i..rows up; 7: i..1; 8: rows..i down
Write vs WriteLine
API
Effect
Use for
Console.Write(j)
Stays on the same line
Each digit on the row
Console.WriteLine()
Ends the current line
After the inner loop finishes
Print digits with Write (no newline), then call WriteLine() once per row.
Try it
Live Preview
Change the row count and the reverse left-growing triangle 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 resultrows = 5 · 15 digits
5
54
543
5432
54321
Trace
Worked Walkthrough — rows = 5
Trace how every row starts at 5 while the stopping digit i moves leftward.
i
Inner j
Prints
5
5..5
5
4
5..4
54
3
5..3
543
1
5..1
54321
Total digits = n(n+1)/2 → O(n²). Same outer loop as Program 6; opposite inner direction.
Code
C# Programs
Three complete programs: fixed rows = 5, TryParse input, and a compact rows = 3 demo. Use View Output to reveal sample results.
Example 1 — Fixed rows = 5
Hard-coded height — outer counts down, inner prints rows..i with no spaces.
C#
using System;
class Program
{
static void Main()
{
int rows = 5;
for (int i = rows; i >= 1; i--)
{
for (int j = rows; j >= i; j--)
Console.Write(j);
Console.WriteLine();
}
}
}
Output
5
54
543
5432
54321
How It Works
1. Outer down.i starts at 5 and moves toward 1 — that extends how far the countdown goes.
2. Inner from peak.j always starts at rows, so every row begins with the same digit.
3. Newline. Call Console.WriteLine() only after the inner loop finishes the row.
Example 2 — User Input Rows
Read rows with int.TryParse, validate, then run the same nested loops.
C#
using System;
class Program
{
static void Main()
{
Console.Write("Enter the number of rows: ");
if (!int.TryParse(Console.ReadLine(), out int rows) || rows <= 0)
{
Console.WriteLine("Please enter a positive integer.");
return;
}
for (int i = rows; i >= 1; i--)
{
for (int j = rows; j >= i; j--)
Console.Write(j);
Console.WriteLine();
}
}
}
Output (when user enters 4)
Enter the number of rows: 4
4
43
432
4321
How It Works
1. Prompt and validate. Prefer TryParse so bad input does not throw. Reject non-positive values.
2. Same core. Outer down / inner rows..i matches Example 1 — only rows comes from the user.
3. Safer input tip. Cap demos for readable single-digit output:
Safer input
if (!int.TryParse(Console.ReadLine(), out int rows) || rows < 1 || rows > 9)
{
Console.WriteLine("Enter a whole number from 1 to 9.");
return;
}
Example 3 — Compact rows = 3
Same structure with only three rows — easy to trace on paper.
C#
using System;
class Program
{
static void Main()
{
int rows = 3;
for (int i = rows; i >= 1; i--)
{
for (int j = rows; j >= i; j--)
Console.Write(j);
Console.WriteLine();
}
}
}
Output
3
32
321
How It Works
1. Three rows.i = 3 → 3; i = 2 → 32; i = 1 → 321.
2. Trace on paper. Confirm every row starts with 3 — only the end digit changes.
3. Scale up next. Once the small demo is clear, use Examples 1–2 for five rows or user input.
Edge Cases & Pitfalls
Check these before calling the solution done.
j = i..rows
Got Program 6 instead
If the inner loop counts up from i to rows, you get 5, 45, 345… Keep j = rows; j >= i; j--.
i = 1..rows
Wrong outer direction
An ascending outer with inner i..1 is Program 7. Program 8 needs outer rows..1 and inner rows..i.
WriteLine inside
Broken rows
If WriteLine() sits inside the inner loop, each digit lands on its own line. Call it only after the row finishes.
rows = 1
Single digit
Output is just 1 — a good sanity check for input validation.
rows > 9
Multi-digit width
Digits 10+ make tight rows hard to read. Cap demos at 9 or switch to spaced Write(j + " ").
TryParse
Validate input
Prefer int.TryParse and require rows > 0 before looping — bad input should not throw.
Analysis
Time and Space Complexity
Program
Time
Extra space
Fixed / input (Examples 1–2)
O(n²)
O(1)
Compact rows = 3 (Example 3)
O(n²)
O(1)
Total digits printed = 1 + 2 + … + n = n(n+1)/2 → O(n²) time. Only a few loop variables are needed.
Remember
Key Takeaways
Always start at peak: outer rows..1, inner rows..i.
Same first digit: every row begins with rows; only the end digit moves left.
Break the row:Console.Write(j) in the inner loop; WriteLine() after it.
Complexity:O(n²) time from n(n+1)/2 digits; O(1) extra space.
One line: count i down from rows, print j from rows down to i, then newline.
Frequently Asked Questions
A reverse left-growing triangle: row 1 shows 5, row 2 shows 54, row 3 shows 543, and so on until the last row shows digits from rows down to 1.
The inner loop always starts at j = rows. Only the stopping value i changes, so each row begins with the peak digit.
When i = 1, the inner loop prints j from rows down to 1.
Program 7 outer counts up and prints i..1 (1, 21, 321). Program 8 outer counts down and inner always starts at rows (5, 54, 543).
Program 6 inner prints i..rows ascending (5, 45, 345). Program 8 inner prints rows..i descending (5, 54, 543).
Console.Write(j) stays on the same line. Console.WriteLine() ends the row after the inner loop.
Change rows or read it from user input with int.TryParse — see Example 2.
O(n²) for n rows because total prints are 1 + 2 + ... + n = n(n+1)/2.
🤔
Did you know?
Each row starts at rows and counts down to i — outer i runs rows..1, inner j prints rows..i — producing 5, 54, 543, and so on. Total prints grow as O(n²).