diff options
| author | Abigail <abigail@abigail.be> | 2020-12-08 00:53:28 +0100 |
|---|---|---|
| committer | Abigail <abigail@abigail.be> | 2020-12-08 00:53:28 +0100 |
| commit | 527f01d216ff1a233327ab332e51e64d764565cd (patch) | |
| tree | a3ad43c0c31f85a6232f5c75f9e2ab75ffaa98d2 | |
| parent | 3ac9d4aa0e32ab4291e2d611d6a7326fe621a506 (diff) | |
| download | perlweeklychallenge-club-527f01d216ff1a233327ab332e51e64d764565cd.tar.gz perlweeklychallenge-club-527f01d216ff1a233327ab332e51e64d764565cd.tar.bz2 perlweeklychallenge-club-527f01d216ff1a233327ab332e51e64d764565cd.zip | |
C solution for week 90/part 2.
| -rw-r--r-- | challenge-090/abigail/README | 1 | ||||
| -rw-r--r-- | challenge-090/abigail/c/ch-2.c | 54 |
2 files changed, 55 insertions, 0 deletions
diff --git a/challenge-090/abigail/README b/challenge-090/abigail/README index 9a1cfc4990..9e71f9a4bd 100644 --- a/challenge-090/abigail/README +++ b/challenge-090/abigail/README @@ -7,4 +7,5 @@ Solution by Abigail * Perl * Task 2 + * C * Perl diff --git a/challenge-090/abigail/c/ch-2.c b/challenge-090/abigail/c/ch-2.c new file mode 100644 index 0000000000..d1a10d7950 --- /dev/null +++ b/challenge-090/abigail/c/ch-2.c @@ -0,0 +1,54 @@ +# include <stdio.h> +# include <stdlib.h> +# include <string.h> + +/* + * For challenge description, see ../perl/ch-2.pl + */ + +char * tick = "\xE2\x9C\x93"; /* UTF-8 bytes for check mark */ + +/* + * Given a number, return the width if printed as a decimal number. + */ +int width (long long number) { + char string [32]; + sprintf (string, "%lld", number); + return ((int) strlen (string)); +} + +int main () { + char * line = NULL; + size_t len = 0; + + while (getline (&line, &len, stdin) != -1) { + long long A, B, P; + if (sscanf (line, "%lld %lld", &A, &B) == 2) { + /* Product we will be working towards */ + P = A * B; + + /* Find the widths */ + int w_A = width (A); + int w_P = width (P); + + /* Main loop */ + while (A) { + printf ("%*lld %*lld %s\n", w_A, A, w_P, B, + A % 2 ? tick : ""); + A = A / 2; + B = B * 2; + } + + /* Print the horizontal bar */ + char line [64]; + sprintf (line, "%*s %*s +\n", w_A, "", w_P, ""); + for (int i = 0; i < w_P; i ++) { + line [w_A + 2 + i] = '-'; + } + printf ("%s", line); + + /* Print the final line with the product */ + printf ("%*s %*lld\n", w_A, "", w_P, P); + } + } +} |
