elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Ejercicios / Re: Problema: Búsqueda en Array en: 30 Junio 2009, 09:31 am
Exactamente, es eso. Ése es el algoritmo en el que analizas todos los casos, y en ese caso te queda O(n^2) donde n es la cantidad de numeros ingresados.

La otra forma (que a mi se me ocurrió, seguro hay otras) es ordenar el array con quicksort que tiene costo n*log(n). Luego uso búsqueda binaria que tiene costo log(n), en el peor caso se hacen n veces búsqueda binaria por lo tanto tengo n*log(n). En total tengo n*log(n)+n*log(n)=2*n*log(n) que es del orden de O(n*log(n)) pues las constantes multiplicativas son despreciables para n suficientemente grande.

Aunque en realidad cabe destacar que quicksort tiene costo n*log(n) en el caso medio (que es lo más probable que suceda). En tal caso lo anterior es correcto. Pero en el peor caso quicksort tiene costo n^2 (por ejemplo si el array ya esta ordenado, el pivote no queda muy al centro que digamos...). Entonces tendría n*log(n) por la busqueda binaria  y n^2 por quicksort, luego el algoritmo es n*log(n)+n^2 que es O(n^2). Pero esto en el peor caso, lo cual es mejor que usar brute force pues de esa forma me queda O(n^2).

Saludos.
12  Programación / Ejercicios / Re: Problema: Búsqueda en Array en: 29 Junio 2009, 08:15 am
Tienes un array, ejemplo: a = [1,2,3,4,5,6,7]
Sea x = 5

Código
  1. ¿Existen un a[i] y un a[j] tal que a[i]+a[j] = x?
  2. Verdadero. En particular, a[1]+a[2] = 5.
  3.  

Si quieres puedes mostrar los índices, todas las soluciones, etc. Pero es simplemente decir "si" si hay al menos una solución ó "no" si no existe solución.

Saludos.

PD: uso la etiqueta code sino me imprime una parte en cursiva...
13  Programación / Ejercicios / Problema: Búsqueda en Array en: 28 Junio 2009, 21:15 pm
Problema: Se recibe un arreglo X de numeros enteros definido en [0, n-1] y un entero x.
Se quiere determinar si existen i, j en [0, n-1] tal que X + X[j] = x.
Diseñe un algoritmo para resolver el problema cuya complejidad sea O(n*log(n)).


Plantear más soluciones.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define FALSE 0
  5. #define TRUE !FALSE
  6. typedef int Bool;
  7.  
  8. /* Algoritmo O(n^2). Analizando todos los casos. */
  9. Bool f1(int *a, int x, int tam);
  10.  
  11. /* Algoritmo O(n*log(n)). Ordeno con quicksort y uso busqueda binaria "n" veces. Me queda 2*n*log(n) que es O(n*log(n))*/
  12. Bool f2(int *a, int x, int tam);
  13. void quicksort(int *, int, int);
  14. void pivot(int *, int, int, int *);
  15. void swap(int *, int, int);
  16.  
  17. int main()
  18. {
  19. int tam, contador, x;
  20. Bool b;
  21.  
  22. printf("Ingrese 'x': ");
  23. scanf("%d", &x);
  24. printf("Tamaño del array (>=2): ");
  25. scanf("%d", &tam);
  26. int *a = (int *) calloc (tam, sizeof(int));
  27.  
  28. for(contador=0; contador<tam; contador++)
  29. {
  30. printf("Ingrese el contenido de la celda %d: ", contador);
  31. scanf("%d", &a[contador]);
  32. }
  33.  
  34. printf("\n\n");
  35. for(contador=0; contador<tam; contador++)
  36. printf("%d  ", a[contador]);
  37.  
  38. /* ********************************************** */
  39. b = f2(a, x, tam); /* solo cambiar "f1" por "f2" para cambiar de algoritmos */
  40. if(b == TRUE)
  41. printf("\n\nHay solucion\n");
  42. else
  43. printf("\n\nNo hay solucion\n");
  44. /* ********************************************** */
  45.  
  46. free(a);
  47. a=NULL;
  48.  
  49. system("pause");
  50. return 0;
  51. }
  52.  
  53. /* Algoritmo O(n^2). Analizando todos los casos. */
  54. Bool f1(int *a, int x, int tam)
  55. {
  56. Bool b=FALSE;
  57. int i, j;
  58. for(i=0; i<tam; i++)
  59. for(j=0; j<tam; j++)
  60. if(a[j]+a[i] == x)
  61. return b=TRUE; /* solución encontrada */
  62.  
  63. return b; /* no hay solución */
  64. }
  65.  
  66. /* Algoritmo O(n*log(n)). Ordeno con quicksort y uso busqueda binaria "n" veces. */
  67. Bool f2(int *a, int x, int tam)
  68. {
  69. quicksort(a, 0, tam-1);
  70.  
  71. Bool b = FALSE;
  72. int izq=0, med, der=tam-1, k=0;
  73.  
  74. while(izq<=der && !b && k<tam)
  75. {
  76. med = (izq+der)/2;
  77.  
  78. if( x<(a[k]+a[med]) )
  79. der = med;
  80. else if ( x>(a[k]+a[med]) )
  81. izq = med;
  82. else if ( x==(a[k]+a[med]) )
  83. return b=TRUE; /* hay solución */
  84.  
  85. k++;
  86. }
  87.  
  88. return b; /* no hay solución */
  89. }
  90.  
  91. void quicksort(int *a, int izq, int der)
  92. {
  93. int piv;
  94. if(izq<der)
  95. {
  96. pivot(a, izq, der, &piv);
  97. /* { Para todo x en a: a[izq,piv] son <= a[piv] && */
  98. /* Para todo x en a: a[piv+1,der] son > a[piv] } */
  99. quicksort(a, izq, piv-1);
  100. quicksort(a, piv+1, der);
  101. }
  102. }
  103.  
  104. void pivot(int *a, int izq, int der, int *piv)
  105. {
  106. int i = izq+1;
  107. int j = der;
  108. *piv = izq;
  109.  
  110. while(i <= j)
  111. {
  112. /* { *piv<i<=j+1 && (Para todo x en a: a[izq,i]<=a[*piv]) && (Para todo x en a: a[j+1,der] > a[*piv]) } */
  113. if(a[i] <= a[*piv])
  114. i=i+1;
  115. else if(a[j] > a[*piv])
  116. j=j-1;
  117. else if(a[i] > a[*piv] && a[j] <= a[*piv])
  118. {
  119. swap(a, i, j);
  120. i = i+1;
  121. j = j+1;
  122. }
  123. }
  124. /* i vale j+1, (Para todo x en a: a[izq,j] <= a[*piv]) && (Para todo x en a: a[i,der] > a[piv] */
  125.  
  126. /* dejando el pivot en una posición más central */
  127. swap(a, *piv, j);
  128. /* nueva posición para pivot */
  129. *piv = j;
  130. }
  131.  
  132. void swap(int *a, int i, int j)
  133. {
  134. int aux = a[i];
  135. a[i] = a[j];
  136. a[j] = aux;
  137. }

Saludos
14  Programación / Ejercicios / Re: Problema de strings: Palindromos. en: 28 Junio 2009, 05:47 am
Un enunciado más complicado del problema:

Citar
Una hilera de letras, o palabra, se llama palindromo cuando tiene más de
una letra y leída de izquierda a derecha y de derecha a izquierda son
iguales, por ejemplo, ababa.

Una hilera se llama i-palindromo cuando quitando el primer carácter de la
izquierda se convierte en palindromo, por ejemplo casa.

Una hilera se llama d-palindromo cuando quitando el primer carácter de la
derecha se convierte en palindromo, por ejemplo amad.

Llamaremos palabras distinguidas a aquellas que son palindromo, ipalindromo
o d-palindromo.

El problema consiste en recibir una palabra y determinar los cortes, si los
hubiera, que la descomponen en dos palabras distinguidas, e indicar para
cada una de ellas de que tipo o tipos es.

Ejemplo 1:
Si la entrada contiene:
azarosos

La salida podría contener:
azar d-palindromo
osos i-palindromo d-palindromo
etc.

Ejemplo 2:
Si la entrada contiene:
amarrar

La salida podría contener:
ama palindromo
rrar i-palindromo
amar d-palindromo
rar palindromo
etc.

Yo hice un par de funciones que descompenen un string en substring (por asi decirlo) y que pueden ayudar un poco en la solución. Pruebenlas y comenten.

Código
  1. void descomponer(char *a)
  2. {
  3.        int unsigned tam_actual = strlen(a);
  4.        int unsigned i, j;
  5.        for(i=0; i<(strlen(a)-1); i++)
  6.        {
  7.                for(j=0; j<tam_actual; j++)
  8.                        printf("%c", a[j]);
  9.                printf("\n");
  10.                tam_actual--;
  11.        }
  12. }
  13.  
  14. void descomponer2(char *a)
  15. {
  16. int unsigned tam_actual = 2;
  17. int unsigned i, j;
  18.  
  19. for(i=0; i<(strlen(a)-1); i++)
  20. {
  21. for(j=0; j<tam_actual; j++)
  22. printf("%c", a[j]);
  23. printf("\n");
  24. tam_actual++;
  25. }
  26. }
  27.  
  28. void descomponer3(char *a)
  29. {
  30. int unsigned tam_actual = 2;
  31. int unsigned i, j, x=0;
  32.  
  33. while(x<(strlen(a)-1))
  34. {
  35. for(i=0; i<(strlen(a)-1); i++)
  36. {
  37. for(j=x; j<tam_actual; j++)
  38. printf("%c", a[j]);
  39. printf("\n");
  40. tam_actual++;
  41. }
  42. tam_actual=2;
  43. x++;
  44. }
  45. }
  46.  
  47. El siguiente simplemente redirige la salida en un fichero:
  48. void descomponer4(char *a)
  49. {
  50. FILE *file = fopen("descomponer.txt","w");
  51. int unsigned tam_actual = 2;
  52. int unsigned i, j, x=0;
  53.  
  54. while(x<(strlen(a)-1))
  55. {
  56. for(i=0; i<(strlen(a)-1); i++)
  57. {
  58. for(j=x; j<tam_actual; j++)
  59. fputc(a[j], file);
  60. fputs("\n", file);
  61. tam_actual++;
  62. }
  63. tam_actual=2;
  64. x++;
  65. }
  66.  
  67. fclose(file);
  68. }
  69.  

Saludos.

EDIT: Aprendí a usar la función GeSHi. Gracias Leo Gutierrez.
15  Programación / Ejercicios / Problema de strings: Palindromos. en: 27 Junio 2009, 21:31 pm
Para ver qué es un palindromo, véase Palindromo. Posteen más soluciones.

Código
  1. /* Algoritmo que te dice si una palabra es palindromo */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define ES_PALIN printf("\n\nEs palindromo\n\n");
  8. #define NO_PALIN printf("\n\nNo es palindromo\n\n");
  9. #define FALSE 0
  10. #define TRUE !FALSE
  11. typedef int Bool;
  12.  
  13. void es_palindromo(char *a)
  14. {
  15.        Bool b = TRUE;
  16.        int ultPos = strlen(a)-1;
  17.        int i;
  18.  
  19.        for(i=0; i<strlen(a); i++, ultPos--)
  20.        {
  21.                if(a[i] != a[ultPos])
  22.                {
  23.                        b = FALSE;
  24.                        break;
  25.                }
  26.        }
  27.  
  28.        if(b) ES_PALIN
  29.        else NO_PALIN;
  30. }
  31.  
  32. int main()
  33. {
  34.        char *a = (char *) calloc (20, sizeof(char));
  35.        printf("Palabra: "); scanf("%s", a);
  36.  
  37.        es_palindromo(a);
  38.  
  39.        free(a); a=NULL;
  40.  
  41.        system("pause");
  42.        return 0;
  43. }
  44.  

Saludos.
16  Programación / Ejercicios / Re: Algoritmia-Ejercicios introductorios. en: 21 Junio 2009, 03:24 am
Edito: le agregue la opcion GeSHi, jeje. Ahora aprendi y queda mas lindo el código.

Citar
Problema 8: Desarrollar un algoritmo para generar los primeros K primeros números primos de la serie Fibonacci.
Ejemplo:
K=6
1 2 3 5 13 89

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define FALSE 0
  6. #define TRUE !FALSE
  7. typedef int Bool;
  8.  
  9. int fib(double n);
  10. Bool es_primo(int num);
  11.  
  12. int main()
  13. {
  14. int n; printf("Cantidad de primos a obtener:  "); scanf("%d", &n);
  15.  
  16. int i=0, j;
  17. for(j=0; j<n;)
  18. {
  19. if( es_primo(fib(i)) )
  20. {
  21. printf("%d  ", fib(i));
  22. j++;
  23. }
  24. i++;
  25. }
  26.  
  27. printf("\n\n");
  28. system("pause");
  29. return 0;
  30. }
  31.  
  32. int fib(double n)
  33. {
  34. double a = 1/sqrt(5);
  35. double b = (1+sqrt(5))/2;
  36. double c = (1-sqrt(5))/2;
  37. double fib_n = a*pow(b, n) - a*pow(c, n);
  38.  
  39. return fib_n;
  40. }
  41.  
  42. Bool es_primo(int num)
  43. {
  44.        Bool b = TRUE;
  45.        int i, divisores=0;
  46.  
  47.        if(num == 0)
  48.                return b=FALSE;
  49.  
  50.        for(i=1; i<=num; i++)
  51.        {
  52.                if((num%i) == 0)
  53.                        divisores++;
  54.                if(divisores > 2)
  55.                {
  56.                        return b=FALSE;
  57.                }
  58. }
  59.  
  60. return b;
  61. }
  62.  
17  Programación / Ejercicios / 105 - C - Solución - Números primos en: 19 Junio 2009, 06:22 am
Extrae los primeros n números primos. No es para nada óptimo, pero bueno está demás decir que obtener primos es un tema en desarrollo. Véase: Great Internet Mersenne Prime Search

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define FALSE 0
  5. #define TRUE !FALSE
  6. typedef int Bool;
  7.  
  8. int longitud(void);
  9. Bool es_primo(int num);
  10.  
  11. int main()
  12. {
  13.        int n = longitud();
  14.  
  15.        int i, num=2;
  16. for(i=0; i<n;)
  17. {
  18.                if(es_primo(num))
  19.                {
  20. printf("%d  ", num);
  21. i++;
  22.        }
  23.  
  24.        num++;
  25. }
  26.  
  27. printf("\n\n");
  28.        system("pause");
  29.  
  30.        return 0;
  31. }
  32.  
  33. Bool es_primo(int num)
  34. {
  35.        Bool b = TRUE;
  36.        int i, divisores=0;
  37.        for(i=1; i<=num; i++)
  38.        {
  39.                if(num%i == 0)
  40.                        divisores++;
  41.                if(divisores > 2)
  42.                {
  43.                        return b=FALSE;
  44.                }
  45. }
  46.  
  47. return b;
  48. }
  49.  
  50. int longitud(void)
  51. {
  52.        int n;
  53.        printf("Cantidad de primos: ");
  54.        scanf("%d", &n);
  55.        return n;
  56. }
  57.  

Saludos.



Links Relacionados:

* Desarrollar un algoritmo para generar los primeros K primeros números primos de la serie Fibonacci.

programacion c++ numeros primos
http://foro.elhacker.net/empty-t215844.0.html

[C\C++] Dudilla con un codigo para ver si un numero es primo
http://foro.elhacker.net/empty-t186450.0.html

[C++] Pseudo Random Encryption Algorithm 1.0 RC2 by APOKLIPTICO.
http://foro.elhacker.net/empty-t233347.0.html

Esquema RSA
http://foro.elhacker.net/empty-t254640.0.html

Algoritmo numeros primos [Batch]
http://foro.elhacker.net/empty-t251824.0.html

[Batch] Algoritmo de Numeros Primos
http://foro.elhacker.net/empty-t235233.0.html

[batch] Problema extraño
http://foro.elhacker.net/empty-t219922.0.html
 
[batch] Descomposicion factorial
http://foro.elhacker.net/empty-t222322.0.html

Calcular numeros primos
http://foro.elhacker.net/empty-t252389.0.html

Numero no-primo terminando en 13?
http://foro.elhacker.net/empty-t252440.0.html

18  Foros Generales / Foro Libre / Re: Todo Gratis en Internet [Recopilación Webs] en: 14 Junio 2009, 15:36 pm
En la sección:

Citar

Podrías agregar:  http://sdd-fanatico.blogspot.com/ una web donde hay peliculas, series, anime. Y son descargas directas y sin vueltas.

Saludos.
19  Informática / Software / Re: Cursos "Guias "Libros Y Manuales De Todo Tipo En Descarga Directa Aqui!!!! en: 11 Junio 2009, 23:32 pm
Cita de Diego Arenas
Citar
por favor postear aqui mismo en el tema si andan en busca de algun curso manual etc me lo hacen saber aqui mismo y tratare de conseguirlo todo el material posteado aqui son subidas mias

Tal vez tu encuentres el siguiente libro:

Autor: WIRTH, N
Titulo: "Algoritmos + Estructuras de Datos = Programas".
Ediciones del Castillo, 1980
ISBN: 84-219-0172-9

Desde ya muchas gracias.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines