• Reto programacion 2 [Nivel basico]

 #491059  por crack81
 04 Mar 2017, 22:40
Siguiendo con los retos de programacion vengo con el siguiente problema un pelin mas complicado que el anterior [ Debe registrarse para ver este enlace ] como siempre aunque el problema esta en la seccion de C/C++ se acepta cualquier lenguaje

El problema es extraido de la web "Acepta el reto"==> [ Debe registrarse para ver este enlace ], me gustaria que sus implementaciones se ajustaran a los requisitos tanto en tiempo como en memoria pero el juez en linea solo soporta a los lenguajes C , C++ y Java.

Los animo a implementar sus algoritmos y en lo posible fuera en C,C++ o Java para hacer las comprobaciones de tiempo y memoria, aun asi, si prefieren otros lenguajes sientanse con la confianza de publicarlas.

Aqui el algoritmo resuelto los nuevos evitense verlo antes de intentarlo

Saludos... :drinking:
 #491135  por albertobsd
 10 Mar 2017, 17:14
Pues aqui dejo mi implementacion, aun que la verdad creo que por usar el ordenamiento burbuja puede que no cumpla con el requerimiento del tiempo.

Lo mas notable del codigo es que convierte el numero de int a char mediante snprintf
snprintf(numero,5,"%04d\0",X);
Esto lo hace asi para poder descomponer el numero mas facilmente.

Y aqui dejo el completo
 #491139  por crack81
 10 Mar 2017, 19:12
@albertobsd Tu algoritmo en teoria trabaja bien pero no cumple las reglas que se estableciero en el enunciado, porfavor no pongas mensaje de ingrese tu numero, ademas tu implementacion no pide la N cantidad de entradas que especifica en el enunciado y por ultimo cuando cuando el numero es el 6174 deberia imprimir el 0 no el 1 .

PD: Recuerda que tu algoritmo sera sometido a un juez en linea y aunque tu yo sepamos que da resultados correctos se tiene que regir segun las reglas dadas
Saludos...
 #491151  por davinciomar
 11 Mar 2017, 05:54
Yo intente hacerlo con array pero al final tienes que hacer arreglos para obtener los numeros de en medio. lo raro esq aunq recorría de manera correcta el orden cambiaba y eso que lo comprobe y todo y recorria perfectamente
Lo que consegui con arrays:

Es bastante facil con un vector no es mí código pero por si alguien le sirve ya que usando vectores es muy facil ordenarlos pero al final hay que usar arreglos tmb:

Y los métodos de ambos que estan muy bien hechos tmb. En esta no podré participar ya que no sé que pasa q los de en medio a veces los repite lo cual no debería.
 #491152  por davinciomar
 11 Mar 2017, 13:50
Al final termine el mio el que hice de cero esta aqui

Por si alguien le sirve saludos. Buenos ejercicios pero suelen ocupar tiempo espero k el proximo siga vivo :drinking:
 #491155  por crack81
 11 Mar 2017, 17:35
@davinciomar No se que compilador usas pero hay un error en la linea 21
if(i==3){
arr = division;
}else{
arr = resto;
}


PD: Mete tu codigo en las etiquetas de <>Sintax en tu caso C++ para que se lea de mejor manera el codigo
Saludos y gracias por tu aportes ... :drinking:
 #491159  por davinciomar
 11 Mar 2017, 19:09
Hola crack tiene errores es por el arr. Por cierto lo etiquetas disculpa. Tambien se puede usar envede q stringstream pasarlos directamente lo q no hice fue mostrar los ceros a la izquierda y agregar que si llega al ciclo 7 el bucle se termina ya que la constante de kaprekar tiene un limite pero me da pereza hacerlo. El codigo debería optimizarse mucho más y dejarlo más claro y corto pero funciona bien.
Aqui esta el código:
#include <iostream>
#include <sstream>
using namespace std;

int num1,z,l,peque,grande;
int numero,division,resto,i,a,j;
int o,mini,maxi,u;
int arr[4];
int mayor[4];
int menor[4];
int mayor1;
int fin = 0;
int menor1;

int prueba(int num){
    division = num;
    resto = num;
    int divide;
    for(i=0;i<=3;i++){
        resto = division%10;
        if(i==3){
            arr[i] = division;
        }
        else{
            arr[i] = resto;
        }
        division/=10;
    }


    mini=arr[0];
    maxi=mini;


    for(o=1;o<4;o++)
    {
        if (arr[o]<mini) mini=arr[o];
        if (arr[o]>maxi) maxi=arr[o];
    }
    peque = 0;
    int aux;
    for(z=0;z<4;z++){
        num1=arr[z];
        if(arr[z] > mini && arr[z] < maxi){
            for(l=0;l<4;l++){
                if(arr[l] < maxi && arr[l] > mini){
                    peque=arr[l];
                }
            }
    }

    }

    int xe;
    for(xe=0;xe<4;xe++){
        if(arr[xe]!=peque & (arr[xe] < maxi && arr[xe] > mini)){
            grande = arr[xe];
            break;
        }else{
            grande = peque;
        }
    }

    if(peque>grande){
        aux=peque;
        peque=grande;
        grande=aux;
    }

    mayor1 = maxi*1000;
    mayor1 += grande*100;
    mayor1 += peque*10;
    mayor1 += mini;

    menor1 = mini*1000;
    menor1 += peque*100;
    menor1 += grande*10;
    menor1 += maxi;



    fin = mayor1 - menor1;
    //cout << fin << " = " << mayor1 << " - " << menor1;
    return fin;
}

int main(){
/* Declaramos el array y le damos valores */
    int entradas,t,contador;
    contador=0;
    t=0;
    cout << "";
    cin >> entradas;
    int ar[entradas];
    for(t=0;t<entradas;t++)
    {
      cout << "";
      cin >> ar[t];
    }
    for(t=0;t<entradas;t++)
    {
        contador=0;
        fin = ar[t];
        contador=0;
        while(fin!=6174){
            fin=prueba(fin);
            //cout << "\n";
            contador++;
        }
        cout << "" << contador;
        cout << "\n";
    }
    return 0;
}
Lo importante es que entendi el código, se resolverlo y si dios quiere algun día aprenda a modularizar.
Un saludo y gracias por sus ejercicios.
 #491161  por crack81
 11 Mar 2017, 20:20
No gracias a ti por tomarte el tiempo, ademas el beneficiado es el que intenta hacerlo ya que aprendes cosas nuevas
Saludos....
 #491202  por albertobsd
 16 Mar 2017, 20:24
Muy buen dia, si es por aprobar al juez y no perde tiempo en calculos aqui les dejo mi implementacion con valores hardcodeados:
En teoria no deberia de superar el maximo de memoia, al ser solo 10k elementos de un byte de longitud Por ser "uint8_t" no debe de pasar de mas de 10KBytes. Si es necesario podria usar solo 4 bits por numero y agruparlos en un solo byte de 2 numeros en 2 numeros y extraerlos mediante desplazamientos y recorrimientos de bits y mascaras and.

Saludos