Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/09/2013, 08:51
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: como creo piramide de numeros primos? c++

Antes de nada, indenta el codigo por favor para que sea amigable y mas gente pueda entenderlo y quiera ayudarte (y usa las etiquetas de formateo que provee el foro, que para eso estan)

Y otra cosa, ya se que no deberia hacerte los deberes, pero bueno ahi va una solucion; no copies y peges, mira el codigo y si hay algo que no queda claro pregunta :)

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef int *NPLISTA;
  4.  
  5. char es_primero(unsigned int num) {
  6.     int q, raiz;
  7.  
  8.     if(!num) {
  9.         return 0;
  10.     }
  11.     if(num == 1 || num == 2) {
  12.         return 1;
  13.     }
  14.     else if(num%2 == 0) {
  15.         return 0;
  16.     }
  17.  
  18.     raiz = sqrt(num*1.0);
  19.     for(q = 3; q <= raiz; q+=2) {
  20.         if(num%q == 0) {
  21.             return 0;
  22.         }
  23.     }
  24.     return 1;
  25. }
  26.  
  27.  
  28. NPLISTA *alloc_nplista(int tam) {
  29.     int numeros_encontrados, numero_actual;
  30.     NPLISTA nplista, aux;
  31.  
  32.     numeros_encontrados = 0;
  33.     numero_actual = 0;
  34.     nplista = 0;
  35.     while(numeros_encontrados < tam) {
  36.         if(es_primero(numero_actual)) {
  37.             if(!nplista) {
  38.                 if(!(nplista = malloc(sizeof(int) * (numeros_encontrados+1)))) {
  39.                     printf("Error de memoria\n");
  40.                     break;
  41.                 }
  42.                 nplista[numeros_encontrados] = numero_actual;
  43.             }
  44.             else {
  45.                 if(!(aux = realloc(nplista, sizeof(int) * (numeros_encontrados+1)))) {
  46.                     free_nplista(&nplista);
  47.                     printf("Error de memoria\n");
  48.                     break;
  49.                 }
  50.                 nplista = aux;
  51.                 nplista[numeros_encontrados] = numero_actual;
  52.             }
  53.  
  54.             numeros_encontrados++;
  55.         }
  56.  
  57.         numero_actual++;
  58.     }
  59.  
  60.     return nplista;
  61. }
  62.  
  63. void free_nplista(NPLISTA *nplista) {
  64.     if(*nplista) {
  65.         free(*nplista);
  66.         *nplista = 0;
  67.     }
  68. }
  69.  
  70. void print_nplista(int *nplista, int tam, int itr, unsigned char inv) {
  71.     int q, w;
  72.  
  73.     for(w = 0; w < itr; w++) {
  74.         if(inv) {
  75.             for(q = tam-1; q >= 0; q--) {
  76.                 printf("%d ", nplista[q]);
  77.             }
  78.         }
  79.         else {
  80.             for(q = 0; q < tam; q++) {
  81.                 printf("%d ", nplista[q]);
  82.             }
  83.         }
  84.     }
  85. }
  86.  
  87. int main() {
  88.     int q, w, tam;
  89.     NPLISTA nplista = 0;
  90.  
  91.     tam = 5;
  92.     for(q = 0; q <= tam; q++) {
  93.         if((nplista = alloc_nplista(q))) {
  94.             print_nplista(nplista, q, 2, 0);
  95.             printf("\n");
  96.         }
  97.         free_nplista(&nplista);
  98.     }
  99.  
  100.     getchar();
  101.     return 0;
  102. }

La idea es muy simple: una funcion que determina si es primero o no, y otra que busca numeros entre 0 (0 nunca será primero) y el que le digas de forma que cada vez que encuentra un primero lo añade a una lista: el truco esta en hacer la lista dinamica (te lo he puesto en c, pero puedes convertirlo a c++ con new y el correspondiente delete, o mejor aun con algun objeto lista stl). Te he implementado una funcion para mostrar los numeros, como seguramente en el temario tendras el ejercicio de hacer lo mismo pero a la inversa esa funcion permite volcar la lista de forma inversa. Primero pides una lista de tam elementos, la funcion retorna esa lista de tam elementos excepto cuando se produce un error que retorna 0; una vez tienes la lista solo tienes que recorrerla dos veces en sentido directo para cumplir con el algoritmo solicitado. Todo lo demas es trabajo basico de punteros con asignacion de memoria dinamica (ok, ya se que suena muy rimbombante o como se diga pero el trabajo en este caso es muy basico :) ).

Ahora que tienes las herramientas solo es cuestion de jugar con los valores:

Código C:
Ver original
  1. tam = 5;
  2. for(q = 0; q <= tam; q++) {
  3.     if((nplista = alloc_nplista(q))) {
  4.         print_nplista(nplista, q, 1, 0);
  5.         print_nplista(nplista, q, 1, 1);
  6.         printf("\n");
  7.     }
  8.     free_nplista(&nplista);
  9. }

Por cierto, esta es una solucion pero puedes hacer otra que se base en calcular una sola lista de numeros y para cada elemento mostrar dos veces los valores de la lista entre 0 y el indice del elemento, el 'renderizado' será el mismo pero con diferente funcionamiento.

Saludos
vosk

Última edición por vosk; 01/09/2013 a las 09:03