From 20abb9af687fd7b7e8c3f71e0f4f28bc8ec028c1 Mon Sep 17 00:00:00 2001 From: sumuel Date: Tue, 15 Sep 2026 18:56:49 +0000 Subject: add verbose flag --- Makefile | 14 +++++++------- main.c | 45 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 3b15937..6134562 100755 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ -#clear ; vim main.c ; gcc main.c -Wall -Wextra -Wpedantic -std=c99 -o collatz - PREFIX = /usr/local CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -O3 @@ -8,17 +6,19 @@ CC = cc SRC = main.c +TARGET = collatz + all: - ${CC} ${CFLAGS} ${SRC} -o collatz + ${CC} ${CFLAGS} ${SRC} -o ${TARGET} .PHONY: all clean dist install uninstall install: all - ${CC} ${CFLAGS} ${SRC} -o collats - cp -f collatz ${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/collatz + ${CC} ${CFLAGS} ${SRC} -o ${TARGET} + cp -f ${TARGET} ${PREFIX}/bin + chmod 755 ${DESTDIR}${PREFIX}/bin/${TARGET} uninstall: - rm -f ${PREFIX}/bin/collatz + rm -f ${PREFIX}/bin/${TARGET} 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