Ver Mensaje Individual
  #10 (permalink)  
Antiguo 14/05/2013, 08:26
ElPatoGarrido
 
Fecha de Ingreso: noviembre-2011
Mensajes: 50
Antigüedad: 13 años
Puntos: 3
Respuesta: Código que cuente números primos y pares en C++

Cita:
Iniciado por razpeitia Ver Mensaje
Este ejercicio es demasiado sencillo. Donde esta lo pesado es checar si el numero es primo.

Suponiendo que n >= 2 entonces solamente tienes que checar que en el rango de 2 a la raíz cuadrada de n no tenga ningún divisor.

Otra cosa n % 1 siempre te va a dar 0.

Por ejemplo en el código de ejemplo, la condición es bastante fácil de derivar.
Código:
i <= sqrt(n)
i^2 <= n
i*i <= n
// Como n & i son siempre mayores a 2 no hay problema con la desigualdad ni con la división
// Ademas la division de 2 enteros siempre regresan un entero
i <= n / i

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int is_prime(int n);
  4. int is_even(int n);
  5.  
  6. int main() {
  7.     int numbers[5] = {2, 7, 8, 10, 2147483647};
  8.     int even_nums = 0, prime_nums = 0, i;
  9.     for(i = 0; i < 5; i++) {
  10.         if(is_even(numbers[i])) even_nums++;
  11.         if(is_prime(numbers[i])) prime_nums++;
  12.     }
  13.  
  14.     printf("Even Numbers:  %d\n", even_nums);
  15.     printf("Prime Numbers: %d\n", prime_nums);
  16.  
  17.     return 0;
  18. }
  19.  
  20. int is_prime(int n) {
  21.     int i;
  22.     if (n == 2) return 1;
  23.     if(n <= 1 || n % 2 == 0) return 0;
  24.     for(i = 3; i <= n / i; i += 2)
  25.         if(n % i == 0) return 0;
  26.     return 1;
  27. }
  28.  
  29. int is_even(int n) {
  30.     return (n % 2) == 0;
  31. }

Buena Suerte.

PD: Los números de ejemplo dan 3 pares y 3 primos.
¿Para ver si un numero es primo basta con avanzar de 2 en 2 a partir del 3?, entiendo el i <= n / i, pero no sabia que no era necesario ir recorriendo cada numero desde el i hasta el sqrt(n).