aaaaaa123456789 icon

JV programming challenges, season 2, week 1, challenge 1

aaaaaa123456789 | PRO | 01/21/15 03:06:51 AM UTC | 0 ⭐ | 612 👁️ | Never ⏰ | []
C |

1.33 KB

|

None

|

0 👍

/

0 👎

/*
  This file is hereby released to the public domain.
  ~aaaaaa123456789, 2015-01-21
*/
 
#include <stdio.h>
#include <stdlib.h>
 
#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;
}

Comments