/*------------------------------------------------------------------------------ * problem014.c: 3n + 1 **----------------------------------------------------------------------------*/ /* Copyright (c) 2009 Peter Bui. All Rights Reserved. * * Peter Bui * **------------------------------------------------------------------------------ * Includes **----------------------------------------------------------------------------*/ #include #include #include /*------------------------------------------------------------------------------ * Type Definitions **----------------------------------------------------------------------------*/ typedef unsigned long ulong; /*------------------------------------------------------------------------------ * Constants **----------------------------------------------------------------------------*/ #define MAX_INTEGER 100000 /*------------------------------------------------------------------------------ * Macros **----------------------------------------------------------------------------*/ #define IS_ODD(x) ((x) % 2) /*------------------------------------------------------------------------------ * Global Variables **----------------------------------------------------------------------------*/ static ulong CycleLengths[MAX_INTEGER + 1]; /*------------------------------------------------------------------------------ * Functions **----------------------------------------------------------------------------*/ static ulong calculate_cycle_length(ulong n) { ulong cycle_length; ulong i; if (n <= MAX_INTEGER && CycleLengths[n]) return (CycleLengths[n]); for (cycle_length = 1, i = n; i != 1; cycle_length++) { if (i <= MAX_INTEGER && CycleLengths[i]) { cycle_length += (CycleLengths[i] - 1); break; } else { i = (IS_ODD(i) ? (3*i + 1) : (i/2)); } } if (n <= MAX_INTEGER) CycleLengths[n] = cycle_length; return (cycle_length); } /*----------------------------------------------------------------------------*/ static ulong calculate_max_cycle_length(ulong min, ulong max) { ulong n, cycle_length, max_cycle_length = 0; for (n = min; n <= max; n++) { cycle_length = calculate_cycle_length(n); if (cycle_length > max_cycle_length) max_cycle_length = cycle_length; } return (max_cycle_length); } /*------------------------------------------------------------------------------ * Main Execution **----------------------------------------------------------------------------*/ int main(int argc, char* argv[]) { ulong min, max, max_cycle_length; CycleLengths[1] = 1; while (scanf("%lu %lu", &min, &max) != EOF) { if (min <= max) max_cycle_length = calculate_max_cycle_length(min, max); else max_cycle_length = calculate_max_cycle_length(max, min); printf("%lu %lu %lu\n", min, max, max_cycle_length); } return (EXIT_SUCCESS); } /*------------------------------------------------------------------------------ * vim: sts=4 sw=4 ts=8 ft=c **----------------------------------------------------------------------------*/