Siguiendo con los retos de programacion vengo con el siguiente problema un pelin mas complicado que el anterior http://indetectables.net/viewtopic.php?f=36&t=56028 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"==> [Enlace externo eliminado para invitados], 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

Mostrar/Ocultar


Saludos... :drinking:
Skype:crack8111
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

Mostrar/Ocultar

@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...
Skype:crack8111
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:

Mostrar/Ocultar


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:

Mostrar/Ocultar


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.
Defender a los debiles!
Al final termine el mio el que hice de cero esta aqui

Mostrar/Ocultar


Por si alguien le sirve saludos. Buenos ejercicios pero suelen ocupar tiempo espero k el proximo siga vivo :drinking:
Defender a los debiles!
@davinciomar No se que compilador usas pero hay un error en la linea 21
if(i==3){
arr = division;
}else{
arr = resto;
}
Imagen


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:
Skype:crack8111
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.
Defender a los debiles!
No gracias a ti por tomarte el tiempo, ademas el beneficiado es el que intenta hacerlo ya que aprendes cosas nuevas
Saludos....
Skype:crack8111
Muy buen dia, si es por aprobar al juez y no perde tiempo en calculos aqui les dejo mi implementacion con valores hardcodeados:

Mostrar/Ocultar

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
Responder

Volver a “C/C++”