Fácil–medio · Arrays
Contar pares e impares
Lee N números y reporta cuántos son pares y cuántos impares. Dos contadores marchando en un mismo bucle — más un matiz con los negativos que el juez encantado probará.
En una fraseCuenta pares e impares con dos contadores e imprime "even: E" y "odd: O"; para un impar negativo n % 2 es −1, así que compara con 0 y no con 1.
El problema
Entrada: la primera línea trae N (1 ≤ N ≤ 1000); la segunda, N enteros (pueden ser negativos o cero).
Salida: dos líneas: even: E y luego odd: O.
Ejemplos:
Ejemplo:
Entrada: Salida:
5 even: 2
1 2 3 4 5 odd: 3
Tu solución
Entrada personalizada para «Ejecutar mi entrada»
La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.
¿Atascado? Pistas
Pista 1 — contadores en paralelo
Ambos en 0 y, dentro del bucle: if (a % 2 == 0) even++; else odd++;. No hace falta array — como en Máximo de un array, puedes procesar los valores según llegan.
Pista 2 — ¿−3 es impar? ¿y el 0?
-3 % 2 es -1 (el resto hereda el signo del dividendo — ver división entera), así que compara con == 0, nunca con == 1: -3 % 2 == 1 es falso y clasificaría mal los negativos. Y el 0 es par — 0 % 2 == 0 se cumple.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int even = 0, odd = 0;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
if (a % 2 == 0) even++;
else odd++;
}
cout << "even: " << even << endl;
cout << "odd: " << odd << endl;
return 0;
}
El patrón contadores-en-un-bucle generaliza a todo problema de clasificación: contar positivos, notas sobre 80, palabras por longitud. Buen reto: contar cuántas veces aparece cada dígito final 0–9 (diez contadores — o un array de diez contadores, que es la puerta a ideas más grandes).
Análisis profundo
Por qué funciona
Dos contadores independientes en una sola pasada demuestran que lo normal es obtener varias estadísticas en un recorrido. Rara vez necesitas dos bucles.
El coste
O(n) de tiempo y O(1) de espacio: una pasada llena los dos contadores.
Dónde falla
n % 2 == 1es falso para los impares negativos: -3 % 2 vale -1. Comprueban % 2 != 0.- Reiniciar un contador dentro del bucle tira todo lo anterior a la última vuelta.
Siguiente paso
Cubos en vez de dos contadores: Frecuencia de dígitos.
Dos cosas para recordar
- En C++, -3 % 2 == -1: compara != 0, no == 1.
- Una pasada puede llenar muchos contadores.
🐞 Esta versión falla: ábrela y pruébala
n % 2 == 1 falla con los impares negativos
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int even = 0, odd = 0;
for (int i = 0; i < n; i++) {
int v;
cin >> v;
if (v % 2 == 0) even++;
else if (v % 2 == 1) odd++;
}
cout << "even: " << even << endl;
cout << "odd: " << odd << endl;
return 0;
}