# Clase 12

**Temas:** Problemas de práctica

## Ejercicio de clase

### Descripción

La descripción del problema original se encuentra [aquí](https://uva.onlinejudge.org/index.php?option=com_onlinejudge\&Itemid=8\&category=24\&page=show_problem\&problem=3999). Para este ejercicio se ha simplificado un poco.

El problema consiste en repartir el canto de la canción de _Happy Birthday_ entre las invitados de una fiesta. Si no recuerdas la canción de _Happy Birthday_ es la siguiente (la festejada se llama Rujia):

```
Happy birthday to you
Happy birthday to you
Happy birthday to Rujia
Happy birthday to you
```

Cada persona debe cantar en orden al menos una palabra de la canción, así que si son 5 personas el reparto sería el siguiente:

```
Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 1: birthday
Persona 2: to
Persona 3: you
Persona 4: Happy
Persona 5: birthday
Persona 1: to
Persona 2: Rujia
Persona 3: Happy
Persona 4: birthday
Persona 5: to
Persona 1: you
```

Observa que la canción contiene 16 palabras, así que si hay 17 personas o más la canción se debe cantar completa nuevamente hasta que todas las personas hayan podido cantar al menos una parte de la canción.

### Entrada

La entrada consiste en un número **N** entero positivo menor a 200, que indica el número de personas invitadas.

### Salida

Debes imprimir el reparto de la canción entre las personas como en el ejemplo anterior.

#### Ejemplo de entrada

```
20
```

#### Ejemplo de salida

```
Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 6: birthday
Persona 7: to
Persona 8: you
Persona 9: Happy
Persona 10: birthday
Persona 11: to
Persona 12: Rujia
Persona 13: Happy
Persona 14: birthday
Persona 15: to
Persona 16: you
Persona 17: Happy
Persona 18: birthday
Persona 19: to
Persona 20: you
Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 6: birthday
Persona 7: to
Persona 8: Rujia
Persona 9: Happy
Persona 10: birthday
Persona 11: to
Persona 12: you
```

## Solución

Sabemos que la canción se debe cantar nuevamente si hay personas que no alcanzan a cantarla.

**¿Cómo sabemos cuántas veces se debe cantar la canción completa?**

Respuesta: Usando la división y el residuo.&#x20;

Como son 16 palabras a cada persona le debe tocar al menos una palabra de la canción, si dividimos el número de personas entre el número de palabras nos indica cuántas veces podemos repetir la canción.&#x20;

Si hay un residuo indica que hubo 1 o más personas que se quedan sin cantar, así que se debe repetirla una vez más. Veamos el código.

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    int guests;
    string song[16] = {
        "Happy", "birthday", "to", "you",
        "Happy", "birthday", "to", "you",
        "Happy", "birthday", "to", "Rujia",
        "Happy", "birthday", "to", "you",
    };

    cin >> guests;
    
    // Calculamos cuantas veces se debe cantar la canción
    int song_times = guests / 16;
    if (guests % 16 != 0) {
        song_times ++;
    }
    
    // Imprimimos la canción el número de veces requerido
    // para que todos los invitados al menos la canten una vez
    for (int i = 0; i < song_times * 16; i++) {
        // Nos auxiliamos del operador módulo para rotar los invitados
        int guest = (i % guests) + 1;
        // Nos auxiliamos del operador módulo para rotar las palabras
        // de la canción
        string word = song[i%16];
        // Imprimimos la persona y la palabra que le toca
        cout << "Persona " << guest << ": " << word << endl;
    }

    return 0;
}

```

## Tarea

1. Repasar las divisiones o el operador módulo.&#x20;
2. Divide y obtiene el residuo los número del **0 al 20** entre **2, 3, 4, 5 y 6**. Observa como se comporta el residuo.
3. Encuentra otra forma y rescribe el código sin usar el operador módulo para rotar las palabras y las personas.
