Shape Rule
Left-shifted triangle
Row i prints i numbers computed as i + j - 1.
i + j - 1 in C
The increasing number triangle using i + j - 1 prints 1, 2 3, 3 4 5, … — a natural follow-up after Program 32’s triangle starting from 11. This tutorial covers the i + j - 1 formula, nested loops, a live preview, worked C examples, edge cases, and complexity.
Left-shifted triangle
Row i prints i numbers computed as i + j - 1.
i = 1..rows
for (i = 1; i <= rows; i++) — one growing row per iteration.
1..i
for (j = 1; j <= i; j++) — prints i values per row.
i + j - 1
Each value is i + j - 1 — row i starts at i when j = 1.
3–9 rows
Pick a row count and draw the increasing triangle in the browser.
Complexity
Prints per row = i — total work scales as n².
A left-shifted increasing number triangle prints values from the formula i + j - 1 on each row. With rows = 5, you get 1, 2 3, 3 4 5, and so on.
In C you use nested loops: outer i = 1..rows, inner j = 1..i, printing (i + j - 1) with a trailing space.
It combines nested loops with a compact arithmetic formula — a step after Program 32’s 9 + i + j offset.
Formula for each value.
Growing row width.
When i=1, j=1 → 1.
Follow Program 32; continue to Program 34 (i + j from 0) next.
In short: outer loop i = 1..rows, inner j = 1..i, print i + j - 1 with a space, then printf("\n").
Given rows = 5, print a left-shifted increasing triangle: for each row i, print j = 1..i values of i + j - 1 separated by spaces.
// rows = 5 (conceptual shape)
// 1
// 2 3
// 3 4 5
// 4 5 6 7
// 5 6 7 8 9 | Item | Type | Description |
|---|---|---|
rows | int | Triangle height — number of lines to print. |
i | int | Outer loop — current row; also part of the formula. |
j | int | Inner loop — column index; runs 1..i per row. |
for i from 1 to rows:
for j from 1 to i:
print (i + j - 1) + space
print newline | Approach | Idea | Best for |
|---|---|---|
| Fixed formula | 1, 2 3, … | Learning and interviews |
| User-input rows | scanf("%d", &rows); | Configurable triangle size |
| Compact trace | rows = 3 on paper first | Debugging loop bounds |
| Goal | Pattern |
|---|---|
| Outer loop | for (i = 1; i <= rows; i++) |
| Inner loop | for (j = 1; j <= i; j++) |
| Print value | printf("%d ", i + j - 1); |
| End the row | printf("\n"); |
| User input | scanf("%d", &rows); |
Same increasing triangle — different ways to control the row count.
i = 1..rowsOne growing row per iteration
i + j - 1Starts at 1
j = 1..ii values per row
j = 1 → iRow starts at row number
Reach for this pattern when teaching formula-based output, growing inner loops, and arithmetic in nested loops.
Natural follow-up after the triangle starting from 11 — uses i + j - 1 to start at 1.
Outer/inner bound practice with an immediate visual check.
Combine loops with scanf for a flexible row count.
Compare Program 32 (9 + i + j) and Program 34 (i + j from 0) next.
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.
Choose a row count between 3 and 9 and draw the increasing triangle in the browser.
Three complete C programs — fixed rows, user input, and a smaller trace demo. Click View Output to reveal sample console results.
Print five rows of the increasing triangle with the i + j - 1 formula.
rows = 5Hard-coded row count — ideal for first demos and screenshots.
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 5; ++i) {
for (j = 1; j <= i; ++j)
printf("%d ", i + j - 1);
printf("\n");
}
return 0;
} When i = 1, the inner loop prints 1+1-1 = 1. When i = 4, it prints 4, 5, 6, 7 — output 4 5 6 7.
Read the row count with scanf instead of hard-coding 5.
Read rows with scanf("%d", &rows) instead of hard-coding 5.
#include <stdio.h>
int main() {
int rows;
int i, j;
printf("Enter rows: ");
scanf("%d", &rows);
if (rows < 1) return 0;
for (i = 1; i <= rows; ++i) {
for (j = 1; j <= i; ++j)
printf("%d ", i + j - 1);
printf("\n");
}
return 0;
} Same formula core as Example 1; only rows comes from user input instead of being hard-coded as 5. Non-numeric input leaves rows unset if you ignore scanf’s return value — always check it in safer labs.
Run with rows = 3 to trace every row on paper before scaling up.
rows = 3Same nested-loop formula with a smaller row count for quick tracing.
#include <stdio.h>
int main() {
int rows = 3;
int i, j;
for (i = 1; i <= rows; ++i) {
for (j = 1; j <= i; ++j)
printf("%d ", i + j - 1);
printf("\n");
}
return 0;
} Only rows changes from 5 to 3 — the nested-loop formula stays identical. Trace i = 1, 2, 3 on paper to see how each row adds one more value.
#include <stdio.h> brings in printf / scanf. Set loop variables i, j with rows = 5.
for (i = 1; i <= rows; i++) — one growing row per iteration.
for (j = 1; j <= i; j++) — prints i values per row.
printf("%d ", i + j - 1) — each value from the arithmetic formula.
printf("\n") ends the row after the inner loop finishes.
Prints per row = i — O(n²) time, O(1) extra memory.
rows = 5Trace each outer-loop value of i, inner-loop range, values printed, and full row output.
i | Inner range (j) | Values (i+j-1) | Row output |
|---|---|---|---|
1 | 1 | 1 | 1 |
2 | 1, 2 | 2, 3 | 2 3 |
3 | 1, 2, 3 | 3, 4, 5 | 3 4 5 |
4 | 1..4 | 4, 5, 6, 7 | 4 5 6 7 |
5 | 1..5 | 5, 6, 7, 8, 9 | 5 6 7 8 9 |
Prints per row = i — total prints = n(n+1)/2 for n rows.
Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.
Clearest visual proof that outer and inner bounds interact.
Example: change inner bound to j <= rows and watch every row print the same width.
Foundation for formula-based triangles and left-shifted sequences starting at 1.
Example: continue to Program 34 for the i + j variant starting from 0.
Practice printf vs printf("\n") without complex math.
Example: put printf("\n") inside the inner loop by mistake.
Add spaces between digits once the two-loop structure works.
Example: use printf("%d ", j) between digits for wider spacing.
Triangular totals make O(n²) concrete for beginners.
Example: count printed numbers for rows = 5 — total is 1+2+3+4+5 = 15.
Pair the pattern with scanf return checks and positive-row checks.
Example: reject max <= 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.
Why this pattern earns a permanent spot in beginner C courses.
Wrong bounds show up immediately as a broken staircase.
Only loops and console output — no arrays or math libraries.
Invert, center, hollow, or change the fill character with small edits.
Streaming output needs no storage beyond loop counters.
Pro Tip: trace i and j on paper for rows = 3 before coding — watch how row i starts at i when j = 1.
Small habits that keep number-pattern code clean.
Inner bound must be j <= i — row i prints exactly i numbers.
scanfCheck the return value so bad input does not leave rows uninitialized.
Only call printf("\n") after the inner loop finishes the row.
Write the formula for each (i, j) pair before coding the loops.
Trace i = 1..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.
Mistakes that commonly break increasing number triangles.
Each digit lands on its own line — you get a column, not a triangle.
→ Use printf("%d ", i + j - 1); printf("\n") only after the inner loop.
Using i + j or 9 + i + j shifts every value — rows no longer start at the row number.
→ Keep i + j - 1 so row i begins at i.
j <= rows prints a rectangle — every row has the same width.
→ Keep for (j = 1; j <= i; j++) so row i prints i values.
Printing numbers without a space makes multi-digit values run together on wider rows.
→ Append a space after each number: printf("%d ", i + j - 1).
Letters or empty input leave rows uninitialized.
→ Check scanf return value and re-prompt on failure.
Check these inputs before calling the solution done.
Output is just 1 — one value, one row.
Outer loop never runs — print nothing or show a message.
rows < 0Treat as invalid; re-prompt instead of silent empty output.
Two rows: 1 and 2 3.
Unchecked scanf leaves rows unset — check the return value.
Total prints = n(n+1)/2 — grows quadratically with row count.
Try these variations to lock in the pattern.
i + j with i starting at 09 + i + j instead of i + j - 1j = 1, i + j - 1 = iscanf return value until rows >= 1i + j - 1. Inner loop runs j = 1..i — row i prints i numbers.printf stays on the line; printf("\n") advances — mix them carefully.rows > 0 for interactive programs; rows = 1 prints a single 1.j = 1, the value is always i — compare with Program 34 where the formula is i + j.Quick Takeaway: outer loop i = 1..rows, inner j = 1..i, print i + j - 1, then printf("\n").
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–3) | O(n²) | O(1) |
| Smaller demo (Example 3) | O(n²) | O(1) |
The increasing number triangle using i + j - 1 is a compact lesson in formula-based nested loops: compute each value with i + j - 1, grow the inner bound to i, and end each row with printf("\n"). Master the fixed-rows version, then try user input and a smaller trace demo.
Practice the three examples above, then continue to Program 34 for the i + j variant starting from 0.
Inner bound must be j <= i — validate rows when reading from the console.
for (i = 1; i <= rows; i++) in the outer loopfor (j = 1; j <= i; j++) prints i valuesprintf("%d ", i + j - 1)scanf return value before using rowsprintf("\n") inside the inner loopj <= rows in the inner loop (prints a rectangle)rows = 1 edge casePrint the pattern the beginner-friendly way.
i + j - 1
Definitionj = 1..i
Codej=1 → i
Codeprintf("\n") after j loop
ShapeO(n²) time
AnalysisEach printed value is computed as i + j - 1. Row i = 1 prints 1; row i = 4 prints 4, 5, 6, 7 — a left-shifted increasing triangle starting at 1.
Move on to the increasing number triangle starting from 0 (i + j) in the C number-pattern series.
12 people found this page helpful