3 /* SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
17 enum { PASCALS_TRIANGLE_MAX_ROWS_FOR_UINT64
= 68 };
19 static uint64_t **create_pascals_triangle(size_t num_rows
)
24 if (!num_rows
|| num_rows
> PASCALS_TRIANGLE_MAX_ROWS_FOR_UINT64
) {
29 triangle
= reallocarray(NULL
, num_rows
+ 1, sizeof(*triangle
));
32 triangle
[num_rows
] = NULL
;
34 for (i
= 0; i
< num_rows
; ++i
) {
35 triangle
[i
] = reallocarray(NULL
, i
+ 1, sizeof(**triangle
));
37 for (j
= 0; j
< i
; ++j
)
42 triangle
[i
][0] = triangle
[i
][i
] = 1;
43 for (j
= 1; j
< i
; ++j
)
44 triangle
[i
][j
] = triangle
[i
- 1][j
- 1] + triangle
[i
- 1][j
];
50 static void free_pascals_triangle(uint64_t **triangle
)
57 for (i
= 0; triangle
[i
]; ++i
)
62 static void print_pascals_triangle(FILE *file
, uint64_t **triangle
)
66 for (i
= 0; triangle
[i
]; ++i
) {
67 for (j
= 0; j
< i
+ 1; ++j
)
68 fprintf(file
, "%" PRIu64
" ", triangle
[i
][j
]);
73 int main(int argc
, char *argv
[])
80 fprintf(stderr
, "Usage: %s ROWS\n", argv
[0]);
84 num_rows
= strtoul(argv
[1], &endptr
, 10);
85 if (!*argv
[1] || *endptr
) {
86 fprintf(stderr
, "ERROR: `%s' is not a valid number\n", argv
[1]);
90 triangle
= create_pascals_triangle(num_rows
);
92 perror("ERROR: unable to create triangle");
95 print_pascals_triangle(stdout
, triangle
);
96 free_pascals_triangle(triangle
);