PROBLEMA
Considerando el siguiente algoritmo
input n
print n
if n = 1 then STOP
if n is odd then n <- 3n + 1
else n <- n/2
GOTO 2
Teniendo la entrada 22, la siguiente secuencia de números se imprimirán 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
El ciclo termina cuando se imprime 1.
Dado un numero "n" de entrada, es posible determinar el número de números impresos (incluyendo el 1). Para un "n" dado esto se llama el ciclo de longitud de "n". En el ejemplo anterior, la duración del ciclo de 22 es 16.
Para cualquier par de números de i y j que son determinar la duración del ciclo máximo entre estos rangos.
ENTRADA
SALIDA
Ejemplo:
entrada
1 10
100 200
201 210
900 1000
Salida
1 10 20
100 200 125
201 210 89
900 1000 174
[Traducido por San Google] :)
SOLUCION:
public class solucion {
int mayor=1;
public solucion(int numero1, int numero2){
//capturamos el valor original de entrada
int n1=numero1;
int n2=numero2;
// si n1 > n2 se invierten los valores
if(numero1>numero2){int tmp=numero1; numero1=numero2; numero2=tmp;}
// los numeros deben estar entre 0 y 1000000
if (((numero1<=1000000) && (numero1>0))&& ((numero2<=1000000)&& (numero2>0))){
//comienza el ciclo entre n1 y n2
for(int i=numero1; i<=numero2;i++){
//obtenemos el numero total de ciclos para i
int j = ciclo(i);
//establecemos el mayor ciclo
if(j>mayor){
mayor=j;
}
}
//muestra la solucion en consola
System.out.println("Solucion " + n1 + " " + n2 + " " + mayor);
}
else{
System.out.println("EL rango de datos no es valido");
}
}
//metodo que evalua la expresion y retorna el total del ciclo
private int ciclo(int n){
//establecemos un contador e 1
int count = 1;
//System.out.print("Para [" +n+"] Serie= ");//opcional
//comenzamos el ciclo
while(true){
//System.out.print(n+" ");//opcional
//cuando se llegue a 1 se rompe el ciclo
if(n==1){break;}
if(!espar(n)){
n = (3 * n) + 1;
}
else{
n = n / 2;
}
count++;
}
//System.out.println(" ciclos: "+ count +" ");//opcional
return count;
}
private boolean espar(int n){
return ((n % 2) == 0);
}
}
Implementando la clase en el main:
public class Main {
public static void main(String[] args) {
new solucion(1,10);
new solucion(100,200);
new solucion(201,210);
new solucion(900,1000);
}
}
3 comentarios:
Sabes yo tambien me tope con ese problema, pero la solucion que tu planteas es la soluciòn obia, es la solucion comun y silvestre, creo que en el concurso uno tiene que buscar soluciones mas eficientes e ingeniosas que esa, no crees..!!
En una maraton de programación lo que importa es resolver el problema, pues gana quien más resuelva problemas. No se le da mucha importancia al estilo de programación
Pero eso es lo mas ineficiente que puede haber, fijate ponele 900000 como numero y te va a demorar años en devolverte el resultado, estas calculando lo mismo demaciadas veces
Publicar un comentario