A reverse ascending number triangle starts with the peak digit alone, then grows by adding digits on the left: each outer index i prints i through rows.
Remember
Rule: for i from rows down to 1
for j from i to rows: print j (no space)
5
45
345
2345
12345 ← rows = 5
In Python use for i in range(rows, 0, -1) and print(j, end="") for j from i to rows, then a bare print() after each row.
Approach
How to Solve It
Outer loop counts down from rows to 1. Inner loop prints digits i..rows. End each row with a bare print().
Method
Idea
Best for
Descending outer + rising start
Outer i = rows..1; inner j = i..rows; print j
Learning, interviews, exams
Spaced digits
print(str(j) + " ", end="") instead of print(j, end="")
Easier reading on each row
Pseudocode
Pseudocode
for i from rows down to 1:
for j from i to rows:
print j
print newline
Cheat sheet
Goal
Pattern
Pick each row
for i in range(rows, 0, -1):
Print digits
for j in range(i, rows + 1): print(j, end="")
End of row
print()
Spaced form
print(str(j) + " ", end="")
vs Program 5
Program 5: 1..i growing right; Program 6: i..rows growing left
Printing Numbers vs Starting a New Line
API
Effect
Use for
print(j, end="")
Stays on the same line
Each digit on the row
print()
Ends the current line
After the inner loop finishes
Digits use end=""; a bare print() ends the row once.
Try it
Live Preview
Change the row count and the reverse ascending 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
45
345
2345
12345
Trace
Worked Walkthrough — rows = 5
Trace how a descending outer index makes each new digit appear on the left.
i
Inner j
Prints
5
5..5
5
4
4..5
45
3
3..5
345
1
1..5
12345
Total digits = n(n+1)/2 → O(n²). Compare with Program 5, where digits grow on the right instead.
Code
Python Programs
Three complete programs: fixed rows = 5, user-input rows, 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 i..rows with no spaces.
Python
rows = 5
for i in range(rows, 0, -1):
for j in range(i, rows + 1):
print(j, end="")
print()
Output
5
45
345
2345
12345
How It Works
1. Outer down.i starts at 5 and moves toward 1 — that start digit moves left each row.
2. Inner up.j runs from i to rows, so every row ends on the same peak digit.
3. Newline. Call bare print() only after the inner loop finishes the row.
Example 2 — User Input Rows
Read rows safely, validate, then run the same nested loops.
Python
try:
rows = int(input("Enter the number of rows: "))
except ValueError:
print("Please enter a positive integer.")
raise SystemExit
if rows <= 0:
print("Please enter a positive integer.")
raise SystemExit
for i in range(rows, 0, -1):
for j in range(i, rows + 1):
print(j, end="")
print()
Output (when user enters 4)
Enter the number of rows: 4
4
34
234
1234
How It Works
1. Prompt and validate. Catch ValueError; reject non-positive values before looping.
2. Same core. Outer down / inner i..rows matches Example 1 — only rows comes from the user.
3. Safer input tip. Cap demos for readable single-digit output:
Safer input
try:
rows = int(input("Enter the number of rows: "))
except ValueError:
print("Enter a whole number from 1 to 9.")
raise SystemExit
if rows < 1 or rows > 9:
print("Enter a whole number from 1 to 9.")
raise SystemExit
Example 3 — Compact rows = 3
Same structure with only three rows — easy to trace on paper.
Python
rows = 3
for i in range(rows, 0, -1):
for j in range(i, rows + 1):
print(j, end="")
print()
Output
3
23
123
How It Works
1. Three rows.i = 3 → 3; i = 2 → 23; i = 1 → 123.
2. Trace on paper. Confirm each new digit is prepended on the left, not appended on the right.
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.
i = 1..rows
Got Program 5 instead
If the outer loop counts up and the inner prints 1..i, you get 1, 12, 123… Keep outer rows..1 and inner i..rows.
j = 1..i
Wrong digit range
Inner must start at i, not 1. Starting at 1 with a descending outer prints a different shape.
bare print()
Broken rows
If bare print() 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 print(str(j) + " ", end="").
Bad input
int(input()) throws
Wrap with try/except ValueError and require rows > 0 before looping.
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
Grow from the left: outer rows..1, inner i..rows.
Same peak every row: every line ends at rows; only the start digit changes.
Break the row:print(j, end="") in the inner loop; bare print() after it.
Next step: Program 7 prints reverse-row triangles like 1, 21, 321.
One line: count i down from rows, print j from i to rows, then newline.
Frequently Asked Questions
The outer loop begins at i = rows. The inner loop prints j from i to rows, so the first row prints only that single digit.
When i = 1, the inner loop runs j from 1 to rows — printing 1, 2, 3, 4, 5 on one line.
Each row adds one more digit on the left: row i prints digits i through rows, e.g. rows=5 gives 5, 45, 345, 2345, 12345.
Program 5 counts the outer loop up and prints 1..i. Program 6 counts the outer loop down and prints i..rows — digits grow from the left instead of the right.
print(j, end="") stays on the same line for each digit. print() ends the row after the inner loop finishes.
Change rows or read it from user input with int(input()) inside try/except — see Example 2.
O(n²) for n rows because total prints are 1 + 2 + ... + n = n(n+1)/2.
One row prints a single digit 1 — the inner loop runs j from 1 to 1 only once.
🤔
Did you know?
The outer loop starts from rows down to 1, and the inner loop prints i..rows — producing 5, 45, 345, and so on. Total prints still grow as O(n²).