No quiero parecer condescendiente, pero esto no requiere tanto un “algoritmo” como un uso básico y directo de una declaración de control muy común, que es el
for
bucle
Primero, prepara las puertas. Las matrices están indexadas a cero, lo que significa que el primer elemento de una matriz está en el índice 0, por lo que asignaré 101 puertas y simplemente no usaré el 0. Eso facilitará razonar sobre las puertas 1 a 100 sin tener que preocuparse por la diferencia de 1.
Las puertas se representarán como una matriz de enteros, donde un valor de 0 significa cerrado y un valor de 1 significa abierto.
int doors[101]; int i; for (i = 1; i <= 100; i++) doors[i] = 0; // doors start closed
(Hay muchas alternativas a lo anterior, pero supongo que solo servirán para confundirte.
int doors[101] = { 0 };
,
memset(doors, 0, 101 * sizeof(int));
, y existen muchos otros equivalentes para inicializar todas las puertas como cerradas. Si compila con -std=c99
, es decir, utilizando el estándar C99 para C, puede inicializar i
dentro del
for
loop también, si quieres:
for (int i = 0; i < 101; i++)
.)
Luego, itera sobre los estudiantes y las puertas para abrir y cerrar. Esto toma dos
for
bucles, y puede ordenarlos de la forma que desee:
- Cada estudiante abre las puertas que son un múltiplo de su identificación.
int door_id, student_id; for (student_id = 1; student_id <= 100; student_id++) { for (door_id = student_id; door_id <= 100; door_id += student_id) { if (doors[door_id] == 0) { // if the door is closed, open it doors[door_id] = 1; } else { // if the door is open, close it doors[door_id] = 0; } // any of the following would also suffice: // doors[door_id] = !doors[door_id]; // doors[door_id] = 1 - doors[door_id]; } }
- Cada puerta es abierta por los estudiantes cuyos identificadores pueden dividir equitativamente la identificación de la puerta.
int door_id, student_id; for (door_id = 1; door_id <= 100; door_id++) { for (student_id = 1; student_id <= 100; student_id++) { if (door_id % student_id == 0) { // ie the remainder of the division (door_id / student_id) is 0 doors[door_id] = !doors[door_id]; // or any of the aforementioned equivalents } } }
Finalmente, cuente el número de puertas abiertas. Recuerde que un valor de 1 significa una puerta abierta.
int open_doors = 0; for (door_id = 1; door_id <= 100; door_id++) if (doors[door_id] == 1) open_doors += 1;
(Como antes, hay muchas formas equivalentes de escribir esto. Podría excluir el
== 1
, por ejemplo, o escribe
++
lugar de
+= 1
)
Y entonces probablemente quieras imprimir este número:
printf("There are %d open doors.\n", open_doors);
Recuerde poner todo esto en un
Definición de la función int main(void)
que termina con
return 0;
y
#include
en la parte superior del archivo.
Aquí hay un programa completo que combina todo lo anterior que imprimirá las puertas abiertas y cuántas son:
#include int main(void) { int doors[101] = { 0 }; int student_id, door_id; for (student_id = 1; student_id <= 100; student_id++) for (door_id = student_id; door_id <= 100; door_id += student_id) doors[door_id] = !doors[door_id]; int open_doors = 0; for (door_id = 1; door_id <= 100; door_id++) if (doors[door_id]) { printf(" %d", door_id); open_doors++; } printf("\nopen doors: %d\n", open_doors); return 0; }
Cuando se compila y ejecuta, esto generará:
1 4 9 16 25 36 49 64 81100
puertas abiertas: 10
Tenga en cuenta también que hay formas más inteligentes de resolver este problema que toda esta iteración. Pero solicitó una forma programática para hacerlo, y supongo que lo está haciendo para practicar la programación básica, por lo que esta es probablemente la solución que se le solicita.