Generate Pascal’s Triangle in C++

Beginner
⏱️ 9 min read
📚 Updated: May 2026
🎯 2 Code Examples
Nested loops

What you’ll learn

  • How the triangle is built: edges are 1, inner cells are sums of the two cells above.
  • How to print a centered triangle with two nested loops and a clever coefficient update (no factorial function).
  • A second style that only adds neighbors from the previous row—same math, different code path.

Overview

Picture row zero as just 1. Each next row grows wider; the numbers are the same ones that appear in algebra when you expand (a + b)n. Programs usually print a few rows for small n so everything fits on screen.

Coefficients

Row i, position j, is “i choose j” when you count from zero.

Live preview

Pick how many rows (capped) and see the triangle in the page.

Two ways

Multiplicative step or add-the-two-above.

Prerequisites

for loops, nested loops, and integer division.

  • #include <iostream>, std::cout, int main().
  • Optional: curiosity about combinations “n choose k”—we explain just enough on this page.

The idea

Start with 1 at the top. Every new row copies 1 on both ends. Every inside slot is “what was above-left” plus “what was above-right”—that rule alone builds the whole triangle.

Computers can either mimic that addition pattern or jump between entries using a shortcut formula so you never store the whole triangle.

First five rows

Shape
        1
      1   1
    1   2   1
  1   3   3   1
1   4   6   4   1

Notice 2 = 1 + 1, 3 = 1 + 2, 6 = 3 + 3, and so on.

Live preview

Choose how many rows to print (1–14 in this demo). Uses the same multiplicative rule as Example 1.

Large row counts can overflow in real C code if you use small integer types.

Live result
Press “Draw triangle.”

Algorithm

Goal: for each row i from 0 to rows - 1, print i + 1 binomial values with optional leading spaces so the shape looks centered.

Outer loop: rows

Row index i runs from 0 upward.

Inner loop: entries

Generate C(i, j) for j = 0 .. i using a running value or neighbor sums.

Spacing

Print spaces before each row so the triangle tips upward in monospace output.

📜 Pseudocode

Pseudocode
for i from 0 to rows - 1:
    print leading spaces for row i
    coeff = 1
    for j from 0 to i:
        print coeff
        coeff = coeff * (i - j) / (j + 1)
    newline
1

Multiplicative update (reference style)

Matches the classic printed layout: three spaces per indent step and %6d columns. numRows = 5 reproduces the sample output below.

c++
#include <iostream>
#include <iomanip>

void generatePascalsTriangle(int rows) {
    for (int i = 0; i < rows; i++) {
        int coefficient = 1;

        for (int j = 0; j < rows - i - 1; j++) {
            std::cout << "   ";
        }

        for (int j = 0; j <= i; j++) {
            std::cout << std::setw(6) << coefficient;
            coefficient = coefficient * (i - j) / (j + 1);
        }

        std::cout << "\\n";
    }
}

int main() {
    int numRows = 5;

    generatePascalsTriangle(numRows);
    return 0;
}

Explanation

The inner update walks across row i without storing the whole triangle. Each new coefficient is the next binomial entry in that row.

2

Build each row from the row above

Same triangle for five rows: keep the previous row in prev[], fill cur[], then copy back. Uses long long for a bit more room before overflow.

c++
#include <iostream>
#include <iomanip>

#define MAXR 64

void generatePascalsTriangleAdditive(int rows) {
    long long prev[MAXR] = {0};
    long long cur[MAXR];

    for (int i = 0; i < rows; i++) {
        cur[0] = 1;
        for (int j = 1; j < i; j++) {
            cur[j] = prev[j - 1] + prev[j];
        }
        if (i > 0) {
            cur[i] = 1;
        }

        for (int j = 0; j < rows - i - 1; j++) {
            std::cout << "   ";
        }
        for (int j = 0; j <= i; j++) {
            std::cout << std::setw(6) << cur[j];
        }
        std::cout << "\\n";

        for (int j = 0; j <= i; j++) {
            prev[j] = cur[j];
        }
    }
}

int main() {
    int numRows = 5;

    generatePascalsTriangleAdditive(numRows);
    return 0;
}

Explanation

This is the “sum of two above” definition turned directly into arrays. It needs O(rows) extra memory for two slices of a row, but the logic is easy to explain on a chalkboard.

Notes

Overflow. Entries grow quickly; for playground sizes use long long or limit rows.

Bigger triangles. For Project Euler–style tasks you might compute coefficients modulo a prime or use arbitrary-precision integers.

❓ FAQ

A stack of rows of numbers where every inner value equals the sum of the two numbers just above it, and the edges are all 1s.
It counts how many ways you can pick k items out of n when order does not matter. The k-th number in row n (starting from 0) is that count.
It updates the next binomial entry along the row without computing factorials. Math books prove this equals C(i, j) if you start with C(i,0)=1.
For this triangle the product always lands on an exact integer before the division, as long as you use integer types that do not overflow. For large rows, use wider types (e.g. long long) or a different algorithm.
It builds each new row by adding the two numbers above&mdash;the picture on the cover of most textbooks. Both examples print the same triangle for the same number of rows if formatting matches.
Printing r rows with the nested loops is O(r^2) numbers. Space is O(1) extra if you only keep one row of coefficients at a time (as in Example 1).

🔄 Input / output

Change numRows in either main. You can later swap in std::cin >> numRows if you want user input.

Edge cases

rows ≤ 0

Nothing to print

Guard at the start of the generator if you accept user input.

rows = 1

Only the tip

You should see a single 1 (plus whatever spacing your loops print).

⏱️ Time and space complexity

ProgramTimeExtra space
Example 1 (multiplicative)O(rows2) printsO(1)
Example 2 (additive rows)O(rows2)O(rows) for buffers

Summary

  • Rule: add two neighbors above, sides stay 1.
  • Code: nested loops plus either multiplicative steps or row buffers.
  • Care: spacing and integer overflow on deep triangles.
Did you know?

Each entry in Pascal’s triangle is a binomial coefficient “n choose k”—the same numbers that show up in the expansion of (a + b)n.

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.

8 people found this page helpful