Porcentaje de numeros primos en un vector

Iniciado por ulbdan, 22 Enero 2017, 07:09 AM

0 Miembros y 1 Visitante están viendo este tema.

ulbdan

Hola a todos, resulta que soy principiante en esto de la programación y tengo que hacer un programa en que me genere de forma aleatoria una cantidad n (ingresada por el usuario) de números y que de todos esos números generados me salga el porcentaje de cuantos son números primos. Tengo ya generados los números lo que me falta es el porcentaje pero no me sale porfa ayudenme.
Esto es lo que he hecho hasta ahora:

#include<stdio.h>
#define LONG_VECTOR 20

char validar(int n);
void generarValores(int a[],int n);
void imprimirValores(int a[],int n);
float porcentajePrimos(int a[],int n);
int main(){
   int valores[LONG_VECTOR], n;
   printf("Ingrese la dimension: ");
   scanf("%d", &n);
   if(validar(n)=='n'){
       printf("Error: Numero no valido!");
       return -1;
   }
   generarValores(valores, n);
   printf("Valores generados: \n");
   imprimirValores(valores, n);
   printf("\nPorcentaje de numeros primos: %.1f", porcentajePrimos(valores, n));
   return 0;
}
char validar(int n){
   if(n>20){
       return 'n';
   }else{
       return 0;

   }
}

void generarValores(int a[],int n){
   int i;
   for(i=0;i<n;i++){
       a[i]=rand()%51;
   }
}

void imprimirValores(int a[],int n){
   int i;
   for(i=0;i<n;i++){
       printf("%d\t",a[i]);
   }
}

float porcentajePrimos(int a[],int n){
   int i,j,acu=0;
   for(i=0;i<n;i++){
           for(j=2;j<a[i];j++){
               if(a[i]%j!=0){
                   acu++;
               }
           }
       return (acu/n)*100;
   }
}




· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

engel lex

#1
for(j=2;j<a[i];j++){
   if(a[i]%j!=0){
       acu++;
   }
}


cuando hagas cosas matemáticas recomiendo leer la teoría tras ello en wikipedia, normalmente ayuda a buscar maneras más eficientes... ese ciclo puede ser mucho más eficiente, pero ahorita no va al caso...

en ese código, cada vez que el numero no es multiplo suma, cosa que para este caso, bueno evita que logres tu objetivo...

lo que debes hacer es:

si el numero es multiplo, suma hace un break; para romper el ciclo y salir ahí tendrías la cantidad de no primos, ya ahí es cosa de restar y listo


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ulbdan

#2
for(j=2;j<a[i];j++){
               if(a[i]%j==0){
                   acu++;
                   break;
               }

           }
               r=n-acu;



Si es que le entendi bien engel lex algo no me sale o le entendi mal no se pero el acumulador se me queda en 0.

engel lex

cuidado con las llaves, mira bien donde tienes el return, en tu codigo original lo tienias dentro del for, así que se retorna en la primera vuelta
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ulbdan

No se que estare haciendo mal pero no me sale :(

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ulbdan

#6
#include<stdio.h>
#define LONG_VECTOR 20

char validar(int n);
void generarValores(int a[],int n);
void imprimirValores(int a[],int n);
float porcentajePrimos(int a[],int n);
int main(){
   int valores[LONG_VECTOR], n;
   printf("Ingrese la dimension: ");
   scanf("%d", &n);
   if(validar(n)=='n'){
       printf("Error: Numero no valido!");
       return -1;
   }
   generarValores(valores, n);
   printf("Valores generados: \n");
   imprimirValores(valores, n);
   printf("\nPorcentaje de numeros primos: %.1f", porcentajePrimos(valores, n));
   return 0;
}
char validar(int n){
   if(n>20){
       return 'n';
   }else{
       return 0;

   }
}

void generarValores(int a[],int n){
   int i;
   for(i=0;i<n;i++){
       a[i]=rand()%51;
   }
}

void imprimirValores(int a[],int n){
   int i;
   for(i=0;i<n;i++){
       printf("%d\t",a[i]);
   }
}

float porcentajePrimos(int a[],int n){
   int i,j,acu=0,r;
   for(i=0;i<n;i++){
           for(j=2;j<a[i];j++){
               if(a[i]%j==0){
                   acu++;
                   break;
               }
               r=n-acu;
               return (r/n)*100;
           }
   }
}


No se que es lo que estará mal...le intenté hacer tambien con una función aparte que me de los primos y los no primos pero tampoco me salio!!

engel lex

Cita de: engel lex en 22 Enero 2017, 16:45 PM
cuidado con las llaves, mira bien donde tienes el return, en tu codigo original lo tienias dentro del for, así que se retorna en la primera vuelta

es todo lo que te dije

las lineas indican los scope (donde abre y cierra cada llave) mira donde está el return... piensa: ¿en que momento se ejecutará?

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.