C# Odd Number Triangle Pattern (Left-Shifted)

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

What Is This Pattern?

A left-shifted odd number triangle prints consecutive odd numbers on each row while the starting odd value increases by 2 — so each row is shorter and shifts left.

Remember
Rule: for i = 1..max step 2, print j = i..max step 2

13579
3579
579
79
9       ← max = 9 (or 10 with odd-only loops)

In C# you solve it with nested loops that both step by 2: for (i = 1; i <= max; i += 2) and for (j = i; j <= max; j += 2), then WriteLine() ends the row. Start at 2 for an even-number mirror.

How to Solve It

Master the odd-only += 2 loops first, then optionally mirror with even starts.

MethodIdeaBest for
Odd += 2Outer picks start odd; inner prints odds up to maxLearning step size, this pattern
Even mirrorSame structure starting at 2Contrast / even-only variant

Pseudocode

Pseudocode
for i from 1 to max step 2:
    for j from i to max step 2:
        print j (no newline)
    print newline

Cheat sheet

GoalPattern
Pick row start (odd)for (i = 1; i <= max; i += 2)
Print odds to maxfor (j = i; j <= max; j += 2) Console.Write(j);
End the rowConsole.WriteLine();
Force odd maxif (max % 2 == 0) max -= 1;
Even mirrorfor (i = 2; i <= max; i += 2) with the same inner shape

Write vs WriteLine

APIEffectUse for
Console.WriteStays on the same lineEach odd number j
Console.WriteLineEnds the current lineAfter the inner loop

Live Preview

Change the maximum and the odd triangle updates instantly. Even values are adjusted down to the nearest odd number.

Whole numbers from 1 to 15. Even input becomes the next lower odd max (e.g. 10 → 9).

Live result max 9 · 15 numbers
13579
3579
579
79
9

Worked Walkthrough — max = 9

Trace each outer-loop value of i and the odd j values printed on that row.

iInner jPrinted rowCount
11, 3, 5, 7, 9135795
33, 5, 7, 935794
55, 7, 95793
77, 9792
9991

Total prints are 5+4+3+2+1 = 15 — triangular in the count of odd values up to max.

C# Programs

Three complete programs: fixed max, input with odd forcing, and an even-number mirror. Use View Output for sample results.

Example 1 — Fixed max = 10

Both loops step by 2 from odd starts, so only odds print (up through 9).

C#
using System;

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

            for (i = 1; i <= 10; i += 2)
            {
                for (j = i; j <= 10; j += 2)
                {
                    Console.Write(j);
                }
                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Odd starts. for (i = 1; i <= 10; i += 2) yields 1, 3, 5, 7, 9 — the first number on each row.

2. Odds to max. When i = 1, the inner loop prints 13579; when i = 9, just 9.

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

Example 2 — User Input

Read the maximum at runtime; force it odd if the user enters an even number.

C#
using System;

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

            Console.Write("Enter the maximum value: ");
            if (!int.TryParse(Console.ReadLine(), out max) || max < 1)
            {
                Console.WriteLine("Please enter a positive whole number.");
                return;
            }

            if (max % 2 == 0) max -= 1;

            for (int i = 1; i <= max; i += 2)
            {
                for (int j = i; j <= max; j += 2)
                {
                    Console.Write(j);
                }
                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Validate and force odd. TryParse rejects bad input; if (max % 2 == 0) max -= 1 turns 8 into 7.

2. Same nested loops. With max = 7, rows end at 7 instead of 9.

Example 3 — Even Number Mirror

Same left-shift structure, but both loops start at 2 and visit only even values.

C#
using System;

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

            for (i = 2; i <= max; i += 2)
            {
                for (j = i; j <= max; j += 2)
                {
                    Console.Write(j);
                }
                Console.WriteLine();
            }
        }
    }
}

How It Works

1. Even starts. i = 2 and j += 2 visit 2, 4, 6, 8, 10 only.

2. Same left shift. Each row starts later, so the triangle shortens — compare with Example 1 to see how the start value changes the sequence.

Edge Cases & Pitfalls

Check these before calling the solution done.

wrong step

j++ instead of j += 2

That includes even numbers. Keep stepping by 2 for odd-only rows.

even max

Even maximum without adjustment

Odd-only loops still skip 10, but forcing max -= 1 makes the bound explicit when reading input.

WriteLine early

WriteLine(j) inside the inner loop

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

max = 1

Single odd

Output is just 1 — a good sanity check.

max ≤ 0

Empty output

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

multi-digit

Write(10) concatenates

The even mirror prints 246810 with no separators — fine for labs; use Write(j + " ") if you want spaced columns.

Time and Space Complexity

ProgramTimeExtra space
Odd loops (Examples 1–2)O(n²)O(1)
Even mirror (Example 3)O(n²)O(1)

About k = (n+1)/2 odd values produce k(k+1)/2 prints — still quadratic in the maximum n.

Key Takeaways

  • Rule: for odd i from 1 to max, print odd j from i to max.
  • Step by 2: += 2 on both loops is what keeps the output odd-only.
  • Write vs WriteLine: numbers stay on the line; WriteLine advances after each row.
  • Next step: Program 18 alternates odd and even rows.

One line: for each odd start from 1 to max, print odds from i to max with Write, then WriteLine.

Frequently Asked Questions

Both loops increment by 2 (i += 2 and j += 2), so they visit only odd values: 1, 3, 5, 7, 9.
Each next row starts from a larger odd number (i increases by 2), so fewer digits print on that row.
On the last iteration, i = 9, so the inner loop prints only 9 once.
Console.Write stays on the same line. Console.WriteLine ends the current line. Digits use Write(j); the row break uses WriteLine after the inner loop.
Not with += 2 starting from odd numbers — that visits only odd values. To include 10, use j++ or handle even values separately.
Subtract 1 (max -= 1) so the last printed odd matches the intended width, as shown in Example 2.
O(n²) for maximum value n. Only about half the numbers are visited due to step size 2, but nested loops still dominate.
Prefer int.TryParse(Console.ReadLine(), out max) 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?

Both loops step by 2 with i += 2 and j += 2, so only odd numbers print. Each row starts at a larger odd value, so the triangle shifts left — still O(n²) for maximum n.

Next: Alternating Odd/Even Triangle

Mix odd and even sequences across rows.

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