Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

9/7/10

Problema resuelto ACM: 3n+1

JAN29

El problema dice asi:
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
La entrada consistirá en una serie de pares de números enteros i y j, un par de enteros por línea. Todos los números enteros será inferior a 1.000.000 y mayor que 0.

Usted debe procesar todos los pares de números enteros y para cada par determinar la duración del ciclo máximo sobre todos los enteros incluyendo i y j.

Usted puede asumir que ninguna operación se desborda un entero de 32 bits.

SALIDA
Para cada par de enteros i y j debe imprimir como salida i, j, y la duración del ciclo máximo de enteros entre e incluyendo i y j. Estos tres números deben ser separados por al menos un espacio con los tres números en una línea y con una línea de salida para cada línea de entrada. Los enteros i y j deben aparecer en la salida en el mismo orden en que aparecieron en la entrada y debe ser seguido por la duración del ciclo máximo (en la misma línea).

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);
        
    }
}


Nota: en la clase Solucion.java, tenemos lineas de codigo marcadas como "opcional", estas lineas de codigo solo sirven para ver con mas detalle la solucion del problema, por ejemplo con esas lineas habilitadas para entrada (1,10), tenemos:


Más vale post publicado que cientos preparados.

3 comentarios:

Anónimo dijo...

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..!!

Anónimo dijo...

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

exequiel dijo...

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

Post recomendado