Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: prometheus48 en 1 Enero 2012, 15:59 pm



Título: Código más eficiente
Publicado por: prometheus48 en 1 Enero 2012, 15:59 pm
Hola,

Estaba yo con el ordenador y de repente se me ocurrió hacer un programa el cual te pide 3 números y después te dice cuál es el más grande.
Pero no solo eso, lo que quería era hacer un programa en C++, que sea lo mas rápido posible, que gaste muy pocos recursos y que ocupe muy poca memoria.
Osea, un programa simple, pero programado de tal forma que sea perfecto.
Hice un código muy simple intentando llamar lo menos posible a funciones,
bueno, aquí va mi código, espero que alguien me diga como mejorarlo, o que posteen
su propia versión

Código
  1. #include <iostream>
  2.  
  3.  
  4.  
  5. int main()
  6. {
  7.    int a,b,c;
  8.    std::cout<<"Type 3 numbers ";
  9.    std::cin>>a;
  10.    std::cin>>b;
  11.    std::cin>>c;
  12.    if(a>b and a>c)
  13.    {
  14.           std::cout<<"The biggest number is \n" <<a<<std::endl;
  15.           std::cin.get();
  16.    }
  17.    if(b>a and b>c)
  18.    {
  19.           std::cout<<"The biggest number is  \n"<<b<<std::endl;
  20.           std::cin.get();
  21.    }
  22.    if(c>a and c>b)
  23.    {
  24.           std::cout<<"The biggest number is \n"<<c<<std::endl;
  25.           std::cin.get();
  26.    }      
  27.    system("PAUSE");
  28.    return EXIT_SUCCESS;
  29. }
  30. [/code==cpp]  
  31. Salu2!


Título: Re: Código más eficiente
Publicado por: folostia en 1 Enero 2012, 16:46 pm
Aquí te dejo mi versión,pero está en C:

Código:
/*el mayor de tres números*/
#include <stdio.h>
#include <stdlib.h>

int main(){
    int mayor,num1,num2;
    printf("Escribe tres numeros: ");
    scanf("%i %i %i", &max,&num1,&num2);
   
    if (max < num1){
        max=num1;
    }
    if (max < num2){
        max=num2;
    }   
    printf("\nEl mayor es: %i",max);
    system("PAUSE");
    return 0;
}


Título: Re: Código más eficiente
Publicado por: Leyer en 1 Enero 2012, 16:55 pm
Mi version, usar system pause? :-X

Código
  1. #include <iostream>
  2. using namespace std;
  3. int main(int argc,char *argv[]){
  4. int n1,n2,n3;
  5. cout<<"Type 3 numbers\n";
  6. cin>>n1>>n2>>n3;
  7. int _M=(n1>n2)?(n1>n3)?n1:n3:(n2>n3)?n2:n3;
  8.        cout<<"The biggest number is " <<_M;
  9.        cin.get();
  10.        cin.get();
  11. return 0;
  12. }
  13.  


Título: Re: Código más eficiente
Publicado por: alexis33de en 1 Enero 2012, 16:56 pm
Mi versión hecha en Borland  ;D. No leí q decía sin funciones XD, nueva versión !!!
Código
  1. #include <iostream.h>
  2. #include <conio.h>
  3.  
  4. int main()
  5. {
  6. int numeros[2];
  7.    int max=0;
  8.   cout<<"coloque los 3 numeros";
  9.    for(int i=0;i<3;i++)
  10.    {
  11.     cin>>numeros[i];
  12.         max=numeros[0];
  13.        if(numeros[i]>max)
  14.   {
  15.     max=numeros[i];
  16.          }
  17.  
  18.    }
  19.   cout<<max;
  20.   getch();
  21.   return 0;
  22. }


Título: Re: Código más eficiente
Publicado por: prometheus48 en 1 Enero 2012, 17:07 pm
Aun más simplificado
Código
  1.  
  2. #include <iostream>
  3.  
  4.  
  5.  
  6. int main()
  7. {
  8.    int a,b,c;
  9.    std::cout<<"Type 3 numbers ";
  10.    std::cin>>a>>b>>c;
  11.    if(a>b and a>c)std::cout<<"The biggest number is \n" <<a;
  12.    std::cin.get();
  13.    if(b>a and b>c)std::cout<<"The biggest number is  \n"<<b;
  14.    std::cin.get();
  15.    if(c>a and c>b) std::cout<<"The biggest number is \n"<<c;
  16.    std::cin.get();
  17.    return 0;
  18. }
  19. [/code=cpp]


Título: Re: Código más eficiente
Publicado por: Sagrini en 1 Enero 2012, 18:20 pm
El último NO es más simplificado que los otros, al contrario.
Os dejo el mío ;)
Código
  1. #include <stdio.h>
  2.  
  3. int main ()
  4. {
  5. int a, b, c; printf ("Escribe tres numeros: "); scanf ("%d %d %d", &a, &b, &c);
  6. if (a<b) a=b; if (a<c) a=c; printf ("El mayor numero ingresado es %d\n\n", a);
  7. getchar (); return 0;
  8. }
  9.  
  10.  


Título: Re: Código más eficiente
Publicado por: ace332 en 1 Enero 2012, 18:23 pm
Otra más en C  ;D. No se cuan rápido sea, me dio flojera comparar :laugh:
Código
  1. #include <stdio.h>
  2.  
  3. #define permutar(a,b) {int t=a;a=b;b=t;}
  4.  
  5. int main()
  6. {
  7.  int a,b,c;
  8.  scanf("%d%d%d",&a,&b,&c);
  9.  if(b<a)permutar(a,b);
  10.  if(c<b)permutar(b,c);
  11.  printf("%d\n",c);
  12.  return 0;
  13. }
  14.  

PD: Ahora que lo veo mejor... es el sort burbuja para 3 elementos

Saludos


Título: Re: Código más eficiente
Publicado por: Sagrini en 1 Enero 2012, 20:46 pm
El tuyo no me gusta :P Tanta llamada a funciones te retrasa mucho. El mío te supera (por milésimas, pero lo hace) en cuestión de tiempo y ciclos ^^


Título: Re: Código más eficiente
Publicado por: alexis33de en 1 Enero 2012, 20:49 pm
Y como se saca los tiempos, no se como se hace en mi compilador  ;D , seria bueno q alguien coloque los tiempos d todos los codigod  :rolleyes:


Título: Re: Código más eficiente
Publicado por: BlackZeroX en 1 Enero 2012, 22:25 pm
...
en CPP
Código
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. /// EntryPoint
  9. int main(int argc, char *argv[])
  10. {
  11.    int a = 16,
  12.        b = 1500,
  13.        c = 14;
  14.  
  15.    cout << "El maximo valor fue: " << max(a,max(b, c)) << endl;
  16.    cin.get();
  17.  
  18.    return EXIT_SUCCESS;
  19. }
  20.  
  21.  

en C-ANSI:

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define max(a,b) a>b?a:b
  5.  
  6. /// EntryPoint
  7. int main(int argc, char *argv[])
  8. {
  9.    int a = 16,
  10.        b = 15,
  11.        c = 14;
  12.  
  13.    printf("El maximo valor fue: %d", max(a, max(b, c)));
  14.    getchar();
  15.  
  16.    return EXIT_SUCCESS;
  17. }
  18.  
  19.  

Tambien puedes suplantar max(a, max(b, c)) por:

Código
  1.  
  2. ((a>((b>c)?b:c))?a:((b>c)?b:c))
  3. ///o tambien por (Son identicos solo quite los parentesis cosa NO recomendada!&#161;):
  4. a>b>c?b:c?a:b>c?b:c
  5.  
  6.  

En ambos codigos... pero no se entiende muy bien que digamos, mejor deja max(a, max(b, c)) ya que se entiende muchisimo mejor!¡.

Dulces Lunas!¡.


Título: Re: Código más eficiente
Publicado por: rir3760 en 2 Enero 2012, 01:33 am
Tambien puedes suplantar max(a, max(b, c)) por:

Código
  1.  
  2. ((a>((b>c)?b:c))?a:((b>c)?b:c))
  3. ///o tambien por (Son identicos solo quite los parentesis cosa NO recomendada!¡):
  4. a>b>c?b:c?a:b>c?b:c
  5.  
  6.  
No. Esto porque el operador ">" tiene mayor prioridad que "?:" y por ello sin paréntesis esta se procesaría así:
Código:
((a > b) > c) ? b ...

Como ya comentaste mejor una función (C++) o macro (C) para obtener el máximo.

Un saludo


Título: Re: Código más eficiente
Publicado por: BlackZeroX en 2 Enero 2012, 06:39 am
No. Esto porque el operador ">" tiene mayor prioridad que "?:" y por ello sin paréntesis esta se procesaría así:

Creo que dice claramente NO RECOMENDADA...

Dulces Lunas!¡.


Título: Re: Código más eficiente
Publicado por: tig0 en 3 Enero 2012, 20:03 pm
ahi va el mio para sacar el maximo de 8 numeros de 16 bits
Código
  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. typedef __declspec(align(8)) struct
  5. {
  6. short _t[4];
  7. }sal;
  8.  
  9. int main()
  10. {
  11.  
  12. sal k, j, e;
  13. k._t[0] = 2;
  14. k._t[1] = 2342;
  15. k._t[2] = 5712;
  16. k._t[3] = 32234;
  17. j._t[0] = 30353;
  18. j._t[1] = 2762;
  19. j._t[2] = 23484;
  20. j._t[3] = 9853;
  21. clock_t start = clock();
  22.  
  23. __asm {
  24. movq mm0, k
  25. movq mm1, j
  26. pmaxsw mm1, mm0
  27. pshufw mm0, mm1, 0x4e
  28. pmaxsw mm1, mm0
  29. pshufw mm0, mm1, 0x11
  30. pmaxsw mm1, mm0
  31. pshufw mm0, mm1, 0x11
  32. pmaxsw mm1, mm0
  33. movq e, mm0
  34. }
  35. clock_t end = clock();
  36. short x = 0;
  37.  
  38. std::cout<< e._t[0] << std::endl << end - start << std::endl;
  39. std::cin.get();
  40. return 0;
  41. }

output
Citar
32234
0


Título: Re: Código más eficiente
Publicado por: prometheus48 en 3 Enero 2012, 20:29 pm
Lo más simple que he podido:
Código
  1. #include <iostream>
  2. int main()
  3. {int a,b,c;
  4. std::cout<<"Escribe 3 numeros";
  5. std::cin>>a>>b>>c;
  6. int n=(a>b)?(a>c)?a:c:(b>c)?b:c;
  7. std::cout<<"El numero mas grande es"<<n;return 0;}


Título: Re: Código más eficiente
Publicado por: Unbr0ken en 3 Enero 2012, 22:40 pm
Lo más simple que he podido:
Código
  1. #include <iostream>
  2. int main()
  3. {int a,b,c;
  4. std::cout<<"Escribe 3 numeros";
  5. std::cin>>a>>b>>c;
  6. int n=(a>b)?(a>c)?a:c:(b>c)?b:c;
  7. std::cout<<"El numero mas grande es"<<n;return 0;}

No porque tu código no posea indentación es más eficiente, tampoco porque no declares el nombre de espacios "std" y lo uses en cada llamada a una de sus funciones internas ganará eficiencia.

Salud.


Título: Re: Código más eficiente
Publicado por: prometheus48 en 3 Enero 2012, 22:49 pm
Ya,

Lo se, esta vez lo que quise era hacerlo lo mas simple posible, vamos sigo el principio KISS

Salud a ti tambien.
Y Salu2 a todos!


Título: Re: Código más eficiente
Publicado por: x64core en 4 Enero 2012, 01:28 am
mi version: :D

Código
  1.  
  2. int main()
  3. {
  4. int vals[] = {0x1456,0x1120,0x2480,0x2345,0x121,0x1900,0x967,0x1356};
  5. __asm
  6. {
  7. mov ecx,0x8;
  8. xor esi,esi
  9. xor eax,eax
  10. l: mov edx,vals[esi]
  11. cmp edx,eax
  12. jl m
  13. mov eax,edx
  14. m: add esi,0x04
  15. loop l
  16.  
  17. }
  18. return 0;
  19. }
  20.  
  21.  

output eax: 0x2480 :D






Título: Re: Código más eficiente
Publicado por: x64core en 4 Enero 2012, 01:35 am
aver si alguien se anima a publicar un reto :3
como antes...


Título: Re: Código más eficiente
Publicado por: ace332 en 4 Enero 2012, 06:06 am
aver si alguien se anima a publicar un reto :3

See.. se aprenden varias cosas al "diseccionar" un problema como se hizo en este hilo.  ;D

Saludos