summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/main.c b/main.c
index fd35397..154f749 100644
--- a/main.c
+++ b/main.c
@@ -1,32 +1,55 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
+
+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;
+
+ /* perhaps there is a less ugly way? */
+ if (verbose) {
+ while ( long_num > 1 ) {
+ long_num = collatz(long_num);
+ printf("%ld\n", long_num);
+ steps++;
+ }
+ }
+ else {
+ while ( long_num > 1 ) {
+ long_num = collatz(long_num);
+ steps++;
+ }
+ }
+
+ return steps;
+}
int print_help(char *argv[]) {
- fprintf(stderr,"Usage: %s <number>"
+ fprintf(stderr,"Usage: %s <number> [-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);
+ /* quit from the start */
+ 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;
}