Descripción del Problema:
http://uva.onlinejudge.org/external/1/100.htmlSolución:
Dado dos números enteros i, j se debe determinar el tamaño del ciclo entre ambos números, la descripción del problema no dice que siempre se cumple que i < j en todos los casos, por lo que se debe verificar que esa condición sea verdadera. Ademas se asume que ninguna operación excede un entero de 32-bit.En vez de usar la operación modulo se puede reemplazar por la operación bitwise '&' para determinar si un número es par o impar.
Otra optimización que se puede emplear es aumentar el ciclo en 2 cada vez que se realiza la operación 3n + 1 y en el siguiente paso se debe reducir n por n / 2 para obtener el resultado.
Entrada:
10 1210 201
999999 1
Salida:
10 1 20210 201 89
999999 1 525
#include <cstdio> #include <algorithm> using namespace std; int main() { int i, j, max_cycle_length, cycle_length, n; while (scanf ("%d%d", &i, &j) == 2) { printf("%d %d ", i, j); if (j < i) { swap (i, j); } max_cycle_length = 0; while (i <= j) { n = i; cycle_length = 1; while (n != 1) { if (n&1) { n = (3 * n) + 1; } else { n /= 2; } cycle_length++; } if (max_cycle_length < cycle_length) { max_cycle_length = cycle_length; } i++; } printf("%d\n", max_cycle_length); } return 0; }
No hay comentarios:
Publicar un comentario