Left-Aligned Descending Number Triangle in C

Beginner
⏱️ 9 min read
📚 Updated: Aug 2026
🎯 3 Code Examples
🚀 Live Preview
Nested Loops

What You’ll Learn

The left-aligned descending number triangle prints 54321, 5432, 543, 54, 5 — a natural step after Program 3’s reverse descending triangle. This tutorial covers ascending outer loop with shrinking inner bound, a live preview, algorithm steps, worked C examples, edge cases, and complexity.

Shape Rule

rows..i per row

Row 1 prints 54321, row 2 prints 5432, shrinking until a single 5 — always starting at rows.

Outer Loop

i = 1..rows

for (i = 1; i <= rows; i++) increases the inner-loop stop value each iteration.

Inner Loop

rows..i descending

for (j = rows; j >= i; j--) prints from the maximum digit down to i.

printf vs newline

Same line / next line

Digits use printf("%d", j); end each row with printf("\n").

Live Preview

3–9 rows

Pick a row count and draw the left-aligned descending triangle in the browser.

O(n²)

Complexity

Total digit prints = n(n+1)/2; extra memory stays O(1).

Introduction

A left-aligned descending number triangle prints each row from rows down to i while the outer loop increases the stop value. With rows = 5, the output is 54321, 5432, 543, 54, 5.

In C the outer loop runs i = 1..rows, the inner loop prints j from rows down to i, then printf("\n") moves to the next line.

Why it matters?

It teaches variable inner-loop stop conditions — a key step after Program 3’s reverse descending rows.

Key Highlights

Shrinking rows

Inner bound stops at i.

Fixed start

Every row begins at rows.

vs Program 3

Program 3 starts each row at i; Program 4 always starts at rows.

Series Foundation

Follow Program 3; continue to Program 5 next.

In short: outer i = 1..rows, inner j = rows..i, printf("%d", j), then printf("\n").

📝 Problem & Approach

Given a positive integer rows (e.g. 5), print a left-aligned descending triangle: each row prints digits from rows down to i, with the outer loop counting from 1 up to rows.

c
// rows = 5
//54321
//5432
//543
//54
//5

Inputs & Outputs

ItemTypeDescription
rowsintNumber of triangle lines — also the maximum digit and first digit on every row.
iintOuter loop — current row index; inner loop stops at i.
jintInner loop — descending from rows down to i.

Minimal workflow

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

Approach comparison

ApproachIdeaBest for
Nested loops54321, 5432, …Learning and interviews
User-input rowsscanf("%d", &rows);Flexible console programs
Spaced outputprintf("%d ", j)Easier reading per row

⚡ Quick Reference

GoalPattern
Walk rowsfor (i = 1; i <= rows; i++)
Print digits rows..ifor (j = rows; j >= i; j--) printf("%d", j);
End the rowprintf("\n");
Spaced digitsprintf("%d ", j);
User inputscanf("%d", &rows);
Program 3 contrastfor (i = rows; i >= 1; i--) with j = i..1

📋 Fixed Rows vs User Input vs Spaced Output

Same left-aligned descending triangle — different ways to control rows and formatting.

Outer loop
i = 1..rows

Increases stop value each line

Inner loop
j = rows..i

Descending digits per row

Fixed start
rows

First digit every row

Learning tip
j--

Inner loop must count down

Context

When This Pattern Shows Up

Reach for this pattern when teaching descending inner loops and shrinking row lengths.

  1. Post Program 3 exercise

    Natural follow-up after Program 3 — same shrinking rows but every line starts at rows.

  2. Nested-loop warm-up

    Outer/inner bound practice with an immediate visual check.

  3. Console I/O practice

    Combine loops with scanf for a flexible row count.

  4. Gateway to variants

    Compare Program 3 (reverse descending) and Program 5 (next in series) next.

  5. Not a UI layout tool

    This is a console teaching pattern — not how you build modern app screens.

Key benefit: one small program that locks in nested loops, output sequencing, and O(n²) thinking.

🔮 Live Preview

Choose a row count between 3 and 9 and draw the left-aligned descending triangle in the browser.

Try 4, 5, or 7. Max up to 9 in this preview.

Live result
Press "Draw pattern".

Examples Gallery

Three complete C programs — fixed rows, user input, and spaced output. Click View Output to reveal sample console results.

📚 Getting Started

Print five rows of the left-aligned descending triangle with nested loops.

Example 1 — Fixed rows = 5

Hard-coded row count — ideal for first demos and screenshots.

c
#include <stdio.h>

int main() {
    int rows = 5;
    int i, j;

    for (i = 1; i <= rows; i++) {
        for (j = rows; j >= i; j--)
            printf("%d", j);

        printf("\n");
    }

    return 0;
}

How It Works

When i = 1, the inner loop prints 5, 4, 3, 2, 1 — output 54321. When i = 5, only one digit prints — output 5. The outer loop increases i each row, shortening the inner loop.

📈 User Input

Read the row count with scanf instead of hard-coding 5.

Example 2 — User Input

Read rows with scanf("%d", &rows).

c
#include <stdio.h>

int main() {
    int rows;
    int i, j;

    printf("Enter the number of rows: ");
    scanf("%d", &rows);

    for (i = 1; i <= rows; i++) {
        for (j = rows; j >= i; j--)
            printf("%d", j);

        printf("\n");
    }

    return 0;
}

How It Works

Same inner-loop core as Example 1; only the source of rows changes from a literal to user input.

⚡ Spaced Output

Add a space between digits for easier reading on each row.

Example 3 — Spaced Digits

Keep rows = 5 but print each digit followed by a space.

c
#include <stdio.h>

int main() {
    int rows = 5;
    int i, j;

    for (i = 1; i <= rows; i++) {
        for (j = rows; j >= i; j--)
            printf("%d ", j);

        printf("\n");
    }

    return 0;
}

How It Works

Only the print statement changes — printf("%d ", j) instead of printf("%d", j). Loop bounds stay the same as Example 1.

🧠 How the Algorithm Prints Rows

1

Set up

#include <stdio.h> brings in printf / scanf. Set loop variables i, j with rows = 5.

Setup
2

Outer loop walks rows

for (i = 1; i <= rows; i++) — ascending outer loop increases the inner-loop stop value each row.

Row
3

Inner loop (j)

for (j = rows; j >= i; j--) — prints digits rows..i in descending order.

Descending
4

New line

printf("\n") ends the row after the inner loop finishes.

Break
=

Left-aligned descending triangle complete

Rows shrink from rows digits to one — O(n²) time, O(1) extra memory.

🔎 Worked Walkthrough — rows = 5

Trace each outer-loop value of i, the inner-loop range, digit count, and full row output.

iInner loop (j)PrintsRow output
15, 4, 3, 2, 1554321
25, 4, 3, 245432
35, 4, 33543
45, 4254
5515

Prints per row = rows - i + 1 — total prints = n(n+1)/2 for n rows.

Use Cases

Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.

1. Teaching Nested Loops

Clearest visual proof that outer and inner bounds interact.

Example: flip j-- to j++ and watch digit order change.

2. Pattern Series Base

Foundation for inverted, pyramid, diamond, and hollow variants.

Example: continue to Program 5 for the next pattern in the series.

3. Console Formatting Drills

Practice printf vs printf("\n") without complex math.

Example: put printf("\n") inside the inner loop by mistake.

4. Spaced Output

Add spaces between digits once the two-loop structure works.

Example: use printf("%d ", j) between digits on each row.

5. Complexity Intuition

Triangular totals make O(n²) concrete for beginners.

Example: count printed digits for rows = 5 — total is 15 (5+4+3+2+1).

6. Input Validation Labs

Pair the pattern with scanf return checks and positive-row checks.

Example: reject rows <= 0 and re-prompt.

Pro Tip: when an interviewer asks for patterns, explain the outer/inner roles first — then write the loops. The story matters as much as the code.

Advantages

Why this pattern earns a permanent spot in beginner C courses.

  1. 1. Instant Visual Feedback

    Wrong bounds show up immediately as a broken staircase.

  2. 2. Minimal Concepts

    Only loops and console output — no arrays or math libraries.

  3. 3. Easy to Extend

    Invert, center, hollow, or change the fill character with small edits.

  4. 4. O(1) Extra Memory

    Streaming output needs no storage beyond loop counters.

Pro Tip: trace i and j on paper for rows = 3 before coding — watch how each row shortens by one digit.

Usage Tips

Small habits that keep number-pattern code clean.

  1. 1. Match Loop Bounds

    Outer loop counts up (i++); inner loop counts down from rows to i.

  2. 2. Check scanf return value

    Avoid crashes when the user types letters instead of a number.

  3. 3. Keep newline outside inner loops

    Only call printf("\n") after the inner loop finishes the row.

  4. 4. Count Down in the Inner Loop

    for (j = rows; j >= i; j--) prints digits rows..i in descending order.

  5. 5. Dry-Run rows = 3

    Trace i = 1, 2, 3 on paper before coding the full rows = 5 demo.

Pro Tip: if the output is a vertical list of single digits per line, you almost certainly put printf("\n") inside the inner loop.

Common Pitfalls

Mistakes that commonly break left-aligned descending number triangles.

  1. 1. Newline Inside the Inner Loop

    Each digit lands on its own line — you get a column, not a triangle.

    → Use printf("%d", j) for digits; printf("\n") only after the inner loop.

  2. 2. Wrong Inner Direction

    for (j = 1; j <= i; j++) prints ascending digits — you get Program 1’s shape, not this one.

    → Keep for (j = rows; j >= i; j--) so each row reads rows..i.

  3. 3. Descending Outer Loop

    for (i = rows; i >= 1; i--) with j = i..1 prints Program 3’s reverse descending triangle instead.

    → Use for (i = 1; i <= rows; i++) with inner j = rows..i for this pattern.

  4. 4. Wrong Inner Stop

    for (j = rows; j >= 1; j--) on every row prints the full line 54321 repeatedly.

    → Stop the inner loop at the current outer value: j >= i, not j >= 1.

  5. 5. Blind scanf

    Letters or empty input leave rows uninitialized or unchanged.

    → Check scanf return value and re-prompt on failure.

Edge Cases

Check these inputs before calling the solution done.

rows = 1

Single digit row

Output is just 1 on one line.

rows = 0

Empty pattern

Outer loop never runs — print nothing or show a message.

Negative

rows < 0

Treat as invalid; re-prompt instead of silent empty output.

rows = 2

Smallest triangle

Two rows: 21 and 2.

Bad input

Non-numeric scanf input

scanf without a return check is unsafe — validate input.

Large rows

Large row count

Each row prints rows - i + 1 digits — total work grows as n(n+1)/2.

🎯 Practice Problems

Try these variations to lock in the pattern.

1. Classic descending triangle

  • Outer loop counts up; inner prints 1..i
  • Review Program 1

2. Left-shifted triangle

  • Compare with Program 2
  • Same outer loop, different inner bounds

3. Next in series

  • Continue with Program 5
  • Build on the same nested-loop skills

4. Spaced output

  • Use printf("%d ", j) between digits
  • Same loops, wider visual spacing

Notes

  • Loop rule. Outer loop: i = 1..rows. Inner loop: j = rows..i with j--.
  • printf stays on the line; printf("\n") advances — mix them carefully.
  • Validate rows > 0 for interactive programs; rows = 1 should print a single 1.
  • Row i prints exactly rows - i + 1 digits — compare with Program 3 where each row prints i digits starting at i.

Quick Takeaway: outer loop i = 1..rows, inner loop j = rows..i with printf("%d", j), then printf("\n").

⏱️ Time and Space Complexity

ProgramTimeExtra space
Nested loops (Examples 1–3)O(n²)O(1)
Smaller demo (Example 3)O(n²)O(1)
Wrap Up

🎉 Conclusion

The left-aligned descending number triangle is a compact nested-loop lesson: an ascending outer loop raises the inner stop each row while the inner loop always starts at rows and counts down to i. Master the fixed-rows version, then try user input and spaced output.

Practice the three examples above, then continue to Program 5 for the next pattern in the series.

Row i prints rows..i — keep printf("%d", j) for digits and printf("\n") for the break, and validate row counts when reading input.

💡 Best Practices

✅ Do

  • Use for (i = 1; i <= rows; i++) in the outer loop
  • Inner: for (j = rows; j >= i; j--) prints digits from rows down to i
  • Use printf("%d", j) for digits and printf("\n") after each row
  • Validate rows ≥ 1 for interactive programs
  • Check scanf return value instead of ignoring bad input

❌ Don’t

  • Call printf("\n") inside the inner digit loop
  • Use ascending inner loop when you meant descending order
  • Use descending outer loop when you meant this left-aligned pattern
  • Ignore bad console input in user-facing demos
  • Skip the rows = 1 edge case

Key Takeaways

Knowledge Unlocked

Five things to remember about this left-aligned descending triangle

Print the pattern the beginner-friendly way.

5
Core concepts
02

Outer loop

Counts up rows

Code
03

Inner loop

j = rows down to i

Code
04

Newline

printf("\n") after inner loop

Shape
O 05

Complexity

O(n²) time

Analysis

❓ Frequently Asked Questions

Because the inner loop always begins at rows (the maximum digit) and counts down. Only the stopping point i changes per row.
Row i prints rows - i + 1 digits — the inner loop runs from j = rows down to i.
Program 3 prints i..1 with a descending outer loop (4321, 321, ...). Program 4 prints rows..i with an ascending outer loop — every row starts at rows.
No — digits are left-aligned with no leading spaces. Each row begins flush left at the maximum digit.
Replace 5 with rows in the outer loop bound — see Example 2.
Use printf("%d ", j) instead of printf("%d", j) — see Example 3.
O(n²) for n rows because total prints are 1 + 2 + ... + n = n(n+1)/2.
Check scanf's return value: if (scanf("%d", &rows) != 1) handle bad input. Unchecked scanf leaves rows uninitialized on failure.
Only one row prints — a single digit matching rows.

Did you Know? 🔊

Each row starts at rows and counts down to i. Row i prints rows - i + 1 digits — total prints = n(n+1)/2; output is left-aligned with no leading spaces.

Continue to Program 5

Move on to the next pattern in the C number-pattern series.

Program 5 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