/* This file is hereby released to the public domain. ~aaaaaa123456789, 2015-01-21 */ #include #include #include "common.h" unsigned long long * get_collatz_sequence(unsigned); int main (void) { printf("Enter a number: "); unsigned number = get_number(); if (!number) { fputs("Invalid number entered\n", stderr); return 1; } unsigned long long * seq = get_collatz_sequence(number); if (!seq) { fputs("Error while calculating sequence: overflowed\n", stderr); return 2; } unsigned long long * curr = seq; while (*curr > 1) printf("%llu ", *(curr ++)); puts("1"); free(seq); return 0; } unsigned long long * get_collatz_sequence (unsigned number) { unsigned long long max_odd = (-1ull) / 3; unsigned long long * result = malloc(sizeof(unsigned long long)); *result = number; unsigned count = 0; while (result[count] > 1) { result = realloc(result, sizeof(unsigned long long) * (count + 2)); if (!result) return NULL; // yes, this leaks memory, but who cares, the program is aborting anyway if (result[count] & 1) { if (result[count] > max_odd) return NULL; result[count + 1] = (result[count] << 1) + result[count] + 1; } else result[count + 1] = result[count] >> 1; count ++; } return result; }