From 20abb9af687fd7b7e8c3f71e0f4f28bc8ec028c1 Mon Sep 17 00:00:00 2001 From: sumuel Date: Tue, 15 Sep 2026 18:56:49 +0000 Subject: add verbose flag --- main.c | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index fd35397..f3a375a 100644 --- a/main.c +++ b/main.c @@ -1,32 +1,55 @@ #include #include +#include + +size_t collatz(size_t long_num) { + return ( long_num & 1 ) ? ((long_num << 1) + long_num ) + 1 : long_num >> 1; +} + +size_t printer(size_t long_num, bool verbose) { + size_t steps = 0; + + /* Probably not the best way to do this */ + switch (verbose) { + case true: + while ( long_num > 1 ) { + long_num = collatz(long_num); + printf("%ld\n", long_num); + steps++; + } + break; + case false: + while ( long_num > 1 ) { + long_num = collatz(long_num); + steps++; + } + } + + return steps; +} int print_help(char *argv[]) { - fprintf(stderr,"Usage: %s " + fprintf(stderr,"Usage: %s [-v]" "\nMade by samuel@yakubos.org\n\n", argv[0]); return 1; } int main(int argc, char *argv[]) { - if ( argc != 2 ) return print_help(argv); + if ( argc < 2 || argc > 3 ) return print_help(argv); + bool verbose = false; char *endptr; long int_number = strtol(argv[1], &endptr, 10); /* check the number for nonsense */ if ( int_number <= 0 ) return print_help(argv); if ( *endptr != '\0' ) return print_help(argv); + if (argc >= 3 && argv[2][1] == 'v') { verbose = true; } + - unsigned long long long_num = int_number; - - int steps = 0; - while ( long_num > 1 ) { - long_num = ( long_num & 1 ) ? long_num * 3 + 1 : long_num / 2; - printf("%llu\n", long_num); - steps++; - } + size_t long_num = int_number; - printf("%s took %d steps\n", argv[1], steps); + printf("%s took %ld steps\n", argv[1], printer(long_num, verbose)); return 0; } -- cgit v1.2.3