ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 79 Colección de Ejercicios Propuestos 1.- MCM Y MCD: Realizar un algoritmo que halle el Mínimo Común Múltiplo y Máximo Común Divisor de un conjunto de números cualquiera. 2.- NUMEROS PERFECTOS Preparar un algoritmo que imprima los números perfectos comprendidos entre 1 y 10.000. Número perfecto es aquel que es igual a la suma de sus divisores propios. Por ejemplo: el número 6 es perfecto pues es igual a 1+2+3. 3.- NUMEROS PRIMOS I Realizar un algoritmo que determine si un nº es primo o no. 4.- NUMEROS PRIMOS II Partiendo del algoritmo anterior, preparar un algoritmo que imprima los N primeros primos. 5.- NUMEROS NO PRIMOS Obtener un algoritmo que determine todos los nº de 3 cifras tal que no sean primos y se cumpla la siguiente condición: centena + decena = unidad. 79 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 80 6.- CRIBA DE ERATOSTENES Un procedimiento para la obtención de números primos consiste en el inventado por Eratóstenes en el Siglo V A.C. Consiste en la creación de una tabla de números cuya posición representa los N números naturales (inicialmente puesta a cero), y comenzando por el segundo elemento, avanzar colocando "unos" un número de posiciones igual a la del elemento que sirve de apoyo (es decir, colocando unos en las posiciones 4,6,8,...). Este proceso se repite para los restantes elementos de la tabla no marcados, y finalizado el mismo los ordinales nulos serán números primos. Elaborar un algoritmo que, mediante esta técnica, calcule los números primos comprendidos entre 1 y N. 7.- PRODUCTO DE MATRICES Dadas dos matrices: A(MxN) y B(NxM), elaborar un algoritmo que efectúe el producto de ambas, depositando el resultado en la matriz A; teniendo en cuenta que no se puede utilizar ninguna matriz auxiliar, como máximo se podrá emplear un vector de apoyo. 8.- MATRIZ ESPIRAL Se define matriz espiral toda matriz en la que la disposición de valores crecientes conforme una espiral, por ejemplo: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 Realizar el algoritmo que genere a partir de la sucesión de los nº naturales una matriz espiral de (mxn). (OJO: no tiene porqué ser cuadrada). 9.- CAMBIO DE BASE (I) Escribir un agoritmo que solicite como cadena de texto la expresión de un número en una base de numeración determinada (que también se ha de solicitar) y escriba el resultado de la expresión de dicho número en el sistema decimal. 80 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 81 Recúerdese que cuando una base es mayor que 10, es necesario indicar dígitos para los valores comprendidos entre 10 y la base-1, y que por convenio se utilizan las letras, comenzando por la A. Para convertir un número expresado en cualquier base a la decimal, no hay más que desarrollar la serie de potencias que dicho número representa, por ejemplo, el hexadecimal 1AB5F se obtendría como: 1AB5F16 = 1 * 164 + 10 * 163 + 11 * 162 + 5 * 161 + 15 * 160 = 10796710 10.- CAMBIO DE BASE (II) Ahora se pide el algoritmo que realice lo inverso del anterior, es decir, que solicitando un número en notación decimal y la nueva base, represente dicho número como una cadena de caracteres. El método propuesto consiste en dividir sucesivamente dicho número por la base deseada (volviendo a dividir el cociente obtenido hasta que sea cero). De esta forma. La sucesión invertida de los restos obtenidos será el número deseado (no se olvide que si la base es mayor de 10, habrá que sustituir algunos valores por letras). 11.- POKER DE DADOS Dado un conjunto de 5 dados (con las caras numeradas del 1 al 6), calcular la frecuencia relativa y absoluta de las veces que se obtiene parejas, dobles parejas, tríos, poker y escalera mediante una simulación de jugadas, en la que las tiradas de los dados se obtienen de forma aleatoria. Frecuencia absoluta: nº de veces que ocurre un suceso especial (pareja, doble, trio, poker y escalera) Frecuencia relativa: relación entre el nº de veces que ocurre un suceso especial y el nº total de sucesos 81 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 82 12.- NUMEROS ROMANOS Construir un algoritmo que solicite un entero entre 1 y 5,000 y obtenga una cadena con su representación en el sistema romano. En este sistema, las letras I, V, X, L, C, D y M tienen los valores 1, 5, 10, 50, 100, 500 y 1000 respectivamente, y una letra de menor valor que precede a otra de mayor valor se le resta, por ejemplo, MCMXLVII sería el 1.947. 13.- ESCRITURA DE NÚMEROS EN CASTELLANO Construir un algoritmo que escriba en castellano el número solicitado. Ej.: número = 226, escribiría: DOSCIENTOS VEINTE Y SEIS 14.- CUATRO EN RAYA Se trata de reproducir el conocido juego en el que dos jugadores van dejando caer alternativamente fichas en un tablero vertical de 64 casillas, ganando la partida aquel que consigue formar una fila horizontal, vertical o diagonal de 4 fichas de su color. Para ello considérese una matriz de 8x8, de la que cada jugador irá escogiendo (si no esta llena) la columna en la que deposita su ficha. El algoritmo determinará el fin de la partida al producirse la situación de "cuatro en raya" o por agotamiento de las casillas (empate). Después de cada jugada, volcará la situación resultante en un fichero denominado "JUGADA.DAT". 15.- MASTER MIND Se trata de elaborar un programa para jugar al "MASTER MIND" numérico. Este juego consiste en adivinar una secuencia aleatoria de cuatro dígitos en el menor número de intentos posible, teniendoen cuenta que el ordenador nos informará, tras cada intento, del número de dígitos correctos en su posición correcta (que denominaremos "muertos"), y del número de dígitos correctos pero en posición incorrecta (que definiremos como "heridos"). Para mayor comodidad, no se admiten repeticiones en la generación de los dígitos. 82 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 83 16.- GRABACION DE MATRICES ESCASAS Se define como matriz escasa aquella que contiene un elevado número de componentes nulos. En cálculo matricial es tarea habitual "compactar" estas matrices de forma que requieren menor cantidad de memoria. Considerese un sistema mediante el cuál una matriz de dimensiones MxN se compacta en un fichero de forma que cada registro del fichero contiene: la fila de la matriz, el número de elementos no nulos de la misma y parejas formadas por los valores de columna con elemento no nulo y elemento propiamente dicho. Se Pide: Preparar un algoritmo que lea un fichero correspondiente a una matriz MxN, almacenada en un fichero de enteros (precedida por sendos registros, con los valores de M y N), y escriba el fichero compactado, igualmente con todos sus elementos numéricos precedidos de los valores de M y de N. 17.- PRODUCTO DE MATRICES ESCASAS Dados dos ficheros que contienen matrices escasas como las definidas en el problema anterior, realizar un algoritmo que deposite su producto en otro fichero de las mismas características. 18.- ORDENAR MATRICES Dada una matriz de (MxN) ordenar sus elementos por filas: 4 3 5 1 2 3 2 1 7 4 5 6 6 8 9 7 8 9 19.- ENCRIPTACION I Codificar un mensaje por el método de César. Este método consiste en relacionar las letras tras desplazar el abecedario un número determinado de posiciones. 83 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 84 Ejemplo: Sea la palabra BECA, codificarla siendo la primera letra del abecedario la H. ABCDEFGHIJ Palabra a codificar BECA HIJKLMNOPQ Palabra codificada ILJH 20.- ENCRIPTACION II Codificar un mensaje por el método de la palabra. Este es una variación del metodo de cesar, donde el abecedario comienza con una palabra y las letras que la incluyen son saltadas en la nueva configuración del abecedario. Ejemplo: Sea la palabra CEBADA, siendo la palabra clave JUEGO. ABCDEFGHIJKLMNÑOPQRSTUVWXYZ JUEGOABCDFHIKLMNÑPQRSTVWXYZ CEBADA EOUJGA Fíjese que las letras de la palabra clave se saltan en el nuevo abecedario, y que ésta no puede tener letras repetidas. 21.- POLINOMIOS Suponiendo que los grados de un polinomio corresponden a las posiciones de un vector y los coeficientes están almacenados en dichas posiciones. Realizar un algoritmo que divida dos polinomios y otro que multiplique dos polinomios. 22.- NÚMERO DE DÍAS Dadas dos fechas cualesquiera se pide la realización de un algoritmo que calcule el número de días que existe entre ambas. Para ello se comprobará previamente que dichas fechas son correctas (p.ej: una fecha no puede ser el 31 de abril) y considerando los años bisiestos. 84 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 85 23.- DÍA DE LA SEMANA: Dada una fecha cualquiera (anterior o posterior a la actual), elaborar un algoritmo que, partiendo de una fecha de referencia, calcule el día de la semana para dicha fecha. 24.- GENERADOR DE CALENDARIO: Elaborar un algoritmo que, sabiendo que el 1 de enero de 1.900 fue lunes y aprovechando lo aprendido en los dos ejercicios anteriores, genere el calendario de cualquier mes de cualquier año. 25.- ORDENACIÓN DE FICHEROS Dado un fichero de 'n' registros, ordenarlos suponiendo que los 'n' registros pueden ser almacenados en memoria en un vector. 26.- ORDENACIÓN DE GRANDES FICHEROS Se propone una extensión del ejercicio anterior, suponiendo que el fichero sea tan grande que no quepa en la memoria. En este caso, consideraremos que un número de registros (supongamos 1,000) pueden ser introducidos en la memoria simultáneamente. La mecánica que se sugiere es leer bloques de 1,000 registros (hasta haber leido el fichero completamente), que se van ordenando en memoria; y posteriormente intercalando (merge) con el resultado de la intercalación anterior. De esta forma con dos ficheros temporales se conseguirá la ordenación de fichero, sea cual sea su número de registros. 27.- REGISTROS IGUALES Dado dos ficheros ORDENADOS, generar otro fichero donde aparezcan todos los registros que se encuentren simultáneamente en los dos primeros. El proceso se hará de forma secuencial, es decir, suponiendo que los datos NO pueden ser leídos completamente en la memoria. 85 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 86 28.- REGISTROS DISTINTOS Dado dos ficheros ORDENADOS, generar otro donde aparezca todos los registros que no se repitan en los dos primeros. Suponemos que los datos NO pueden ser leídos completamente en la memoria. 29.- RECUENTO DE PALABRAS: Realizar un algoritmo que lea los registros de un fichero de texto previamente creado y cuente el número de palabras existentes en el texto, clasificándolas según el número de letras de cada una. 30.- DERIVADA DE UNA FUNCIÓN: Dada una función, realizar un algoritmo que calcule el valor de la derivada en un punto a partir de la definición de ésta (aplicación del límite). y f ( x) y' Limx0 f ( x x) f ( x) x 31.- CAMPO MINADO El objetivo de este algoritmo consiste reproducir la construcción interna de un tablero del conocido juego del “campo minado”. Para ello, habrá que distribuir aleatoriamente 50 minas (que se representarán por un valor igual a 9) en una matriz entera de 10 filas y 15 columnas, y a continuación obtener para cada casilla no ocupada por una mina el número de minas adyacentes. 86 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 87 32.- LETRA DEL NIF: Mediante la realización de un algoritmo calcular la letra que le corresponde para completar su Número de Identificación Fiscal (NIF). Para ello se proponen las siguientes operaciones: Divida entre veintitrés su número del DNI. La parte entera del resultado multiplíquela también por veintitrés. operaciones matemáticas) Reste ambos números (el del DNI y el resultante y obtendrá de de las esa sustracción un número comprendido entre cero y veintitrés. Compare el número obtenido con la siguiente tabla alfabética y sabrá cual es su letra para el NIF. Esta operación consiste en realizar el módulo aritmético del DNI por 23 y el resultado que es el resto compararlo con la tabla siguiente. Tabla de Equivalencias: 0=T 1=R 2=W 3=A 4=G 5=M 6=Y 7=F 8=P 9=D 10=X 11=B 12=N 13=J 14=Z 15=S 16=Q 17=V 18=H 19=L 20=C 21=K 22=E 23=T 33.- GRABACIÓN OPTIMIZADA: A partir de las características existentes en los reproductores de disco compacto, crear un algoritmo que imite la función de grabación optimizada de las canciones de un CD; es decir, el objetivo que se pretende con la realización del algoritmo será la de escoger, teniendo en cuenta la duración de la cinta donde se va a grabar (45, 60, 90, 120 minutos), aquella combinación de canciones para que el tiempo sobrante en una cara de la cinta sea el mínimo. 87 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 88 34.- SOPA DE LETRAS: Elaborar un algoritmo que genere una sopa de letras. Una sopa de letras se puede considerar como una matriz de caracteres en la que se han "escondido" una serie de palabras (distribuidas en las 8 direcciones posibles), entre una serie de caracteres generados aleatoriamente. El algoritmo solicitará los siguientes datos: 1.- Número de palabras a esconder en la sopa de letras 2.- Las palabras propiamente dichas 3.- Número de caracteres horizontales y verticales de la sopa (ha de ser como mínimo superior al de la palabra mas larga). Ofreciendo como salida un FICHERO DE TEXTO en el que se encuentre la "sopa resuelta" (es decir, el resultado de distribuir las palabras en la matriz MxN de caracteres antes de rellenarla con caracteres aleatorios), y a continuación la "sopa definitiva" (tal y co mo aparece para ser resuelta como pasatiempo). Funcionalmente, la mayor dificultad de este problema consiste en la distribución de las palabras en la matriz inicialmente vacía. Proponemos los pasos siguientes para cada palabra: 1.- Determinar aleatoriamente la posición (fila y columna) de comienzo de escritura de la palabra en la matriz de caracteres. 2.- Determinar aleatoriamente la dirección de escritura (1 = horizontal, 2 = vertical, 3 = diagonal positiva, 4 = diagonal negativa). Previamente y también de forma aleatoria, invertir o no la palabra para que quede "escrita al revés". 3.- Si la palabra "se sale" de la matriz, volver al paso "1". 35.- CONTROL DE PRESENCIA HORARIA: Dado un fichero de texto (ENTRADAS.DAT) correspondiente a las entradas y salidas del personal de una empresa a la misma, con el siguiente formato: D.N.I 8 primeros caracteres Nombre y apellidos 30 caracteres siguientes Fecha (AAMMDDHHMMSS) 12 caracteres siguientes 88 ETSII Dpto. de Informática y Sistemas Elaborar un ALGORÍTMICA PARTE 1 - TEORÍA algoritmo que genere otro Fundamentos de Informática 89 fichero (PRESENCIA.DAT), con los siguientes valores: D.N.I 8 primeros caracteres Nombre y apellidos 30 caracteres siguientes Número de entradas total 4 caracteres siguientes Total de horas 4 caracteres siguientes Total de minutos 4 caracteres siguientes Total de segundos 4 caracteres siguientes Téngase en cuenta que el fichero de entrada ha de ser tan grande cómo se desee, de forma que no se podrá contemplar la carga del mismo en memoria. Igualmente, obsérvese que el fichero original no distingue entre entradas y salidas, por lo que se contemplarán alternativamente para cada usuario. No obstante, se sabe que el número total de empleados de la empresa no es muy grande, por lo que el proceso del fichero se puede hacer de forma directa (leyéndose una vez cada registro). 36.- CLASIFICACIONES DE FÚTBOL: Dado un fichero CLUBES.DAT que contiene los códigos numéricos (del 1 al 20) y los nombres de los 20 clubes de fútbol de primera división, y otro RESULTADOS.DAT, que contiene los siguientes campos: - Número de jornada - Código del Club Local - Código del Club Visitante - Goles del Club Local - Goles del Club Visitante (Siendo todos ellos números enteros) SE PIDE: Elaborar un algoritmo que a partir de estos dos ficheros genere un tercero llamado CLASIFICACION.DAT, en el que figuren los siguientes campos: 89 ETSII Dpto. de Informática y Sistemas ALGORÍTMICA PARTE 1 - TEORÍA Fundamentos de Informática 90 - Nombre del Club - Partidos jugados, ganados, empatados y perdidos - Goles a favor y en contra - Puntos (3 por partido ganado y 1 por empatado). Este fichero será ordenado por puntos de mayor a menor, prevaleciendo en caso de igualdad la diferencia de goles y en caso extremo el número de goles a favor. Nota: Considérese que ninguna matriz ni vector de memoria puede tener alguna de sus dimensiones superior a 20. Igualmente, el proceso del fichero RESULTADOS.DAT ha de ser secuencial, y el fichero CLASIFICACION.DAT ha de se generado al final del algoritmo. 37.- REINAS: Se trata de colocar 8 reinas en un tablero de ajedrez de forma que no se ataquen entre sí. Como modelo abstracto del problema, consideremos una matriz 8x8 inicialmente vacía, en la que habrá que seleccionar 8 celdas (elementos a[i,j]), de modo que para cada una de ellas se cumplan las siguientes restricciones: a.- ninguna otra casilla seleccionada puede estar en la misma fila b.- ninguna otra casilla seleccionada puede estar en la misma columna c.- ninguna otra casilla seleccionada puede estar en la misma diagonal positiva d.- ninguna otra casilla seleccionada puede estar en la misma diagonal negativa Este problema es del tipo "laberinto", es decir, la solución se debe hallar colocando la primera reina en una casilla cualquiera (por ejemplo la a[1,1]), y las restantes se intentarán colocar incrementando "i" y "j" de tal modo que se cumplan las 4 restricciones. En el caso de que sea imposible colocar una reina determinada, habrá que "retroceder", recolocando la anterior en una posición factible (a no ser que no haya más posiciones, con lo que se retrocedería a su "reina" precedente). Obviamente, la salida de este algoritmo serán las coordenadas de las 8 reinas correctamente colocadas. 90