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