Foros del Web » Programación para mayores de 30 ;) » C/C++ »

como creo piramide de numeros primos? c++

Estas en el tema de como creo piramide de numeros primos? c++ en el foro de C/C++ en Foros del Web. Hola mi duda es como hago para imprimir una piramide de numeros primos, el programa tiene que buscarlos claro, pero por mas que veo este ...
  #1 (permalink)  
Antiguo 27/08/2013, 20:35
 
Fecha de Ingreso: agosto-2013
Mensajes: 1
Antigüedad: 10 años, 7 meses
Puntos: 0
Pregunta como creo piramide de numeros primos? c++

Hola mi duda es como hago para imprimir una piramide de numeros primos, el programa tiene que buscarlos claro, pero por mas que veo este codigo no le hayo!
tengo que mostrar la piramide segun el tamaño de entrada del triangulo! por ejemplo tam = 5 la piramide debe ir asi:

1 1
1 2 1 2
1 2 3 1 2 3
1 2 3 5 1 2 3 5
1 2 3 5 7 1 2 3 5 7

y asi segun sea tam! alguna orientacion de como hacerlo¿? el numero 1 por obligacion debe ir ahi! se le agredecera que me den ideas! ya que mi programa me lo tira asi tam =3

2 3
2 3 2 3
2 3 2 3 2 3

la piramide es de forma triangular! no supe poner sangria!


#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
int tam,n,k,Primo,j;
int main ()
{
cout<<"Ingrese el tamanio del triangulo"<<endl;
cin>>tam;
for(int i = 0; i < tam; i++)
{
for(int j = tam; j >= 0; j--)
{
if (i < j)
cout << " ";
else{
for(n = 2; n <= tam; n++)
{
Primo = 1;
for(k = 2; k < n; k ++)
if(!(n % k))
{
Primo = 0;
break;
}
if(Primo)
cout << setw(2) << (n) ;
}
}
}
for(int j = 0; j < tam; j++)
{
if (j > i)
cout << " ";
else {
for(n = 2; n <= tam; n++)
{
Primo = 1;
for(k = 1; k < n; k ++)
if(!(n % k))
{
Primo = 0;
break;
}
if(Primo)
cout << setw(3) << (n);
}
}
}
cout << endl;
}
system("pause");
}
  #2 (permalink)  
Antiguo 01/09/2013, 08:51
 
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

Etiquetas: int, numero, numeros, piramide, primos, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:00.