1 ¿Cuántas lı́neas escribe este programa para n = 10, para n = 11 y para n = 0? int main() { int n; cin >> n; int i = 1; while (i <= n) { cout << i << endl; i = i + 2; } } 2 ¿Cuántas estrellas escribe este programa para n = 0, para n = 10 y para n = 6? int main() { int n; cin >> n; while (n > 0) { cout << *; n = n - 3; } cout << endl; } 3 Vamos a comparar el algoritmo del producto de dos números de la página 5 del bloque de transparencias IP03 Loops con el algoritmo rápido del producto de la página 7 del mismo documento. Si introducimos los números x = 25 e y = 16. ¿Cuántas sumas del tipo p + x realiza el algoritmo de la página 5? ¿Cuántas multiplicaciones por dos, cuántas divisiones por dos y cuántas sumas p + x realiza el algoritmo rápido del producto para x = 25 e y = 16? Calculad lo mismo para x = 16 e y = 25. ¿Qué operación es en general más costosa, multiplicar por 2 o sumar dos números distintos? El algoritmo del producto rápido es uno de los ’algoritmos fundamentales’ de este curso. 1 4 En la página 11 del bloque de transparencias IP03 Loops hay un ejemplo de programa cuya entrada es una secuencia de caracteres terminada con el carácter ’.’. Tomando este programa como ejemplo, escribid un programa que lea una secuencia no vacı́a de números enteros positivos terminada en 0, y escriba la suma y el producto de todos los números de la secuencia. 5 En la página 13 del bloque de transparencias IP03 Loops hay un programa que cuenta las cifras de un número. Tomándolo como ejemplo construid un programa que, dado un número n de k cifras y un número i entre 1 y k, escriba la i-ésima cifra de n comenzando por la derecha. Por ejemplo, dados n = 1963584 e i = 3 escribe 5, y dados n = 0 e i = 1 escribe 0. 6 En las páginas 14 a 18 del bloque de transparencias IP03 Loops se muestran dos versiones del algoritmo de Euclides para el cálculo del máximo común divisor de dos números enteros positivos. De acuerdo con el resultado de (Lamé, 1844) ¿Cuántas iteraciones realizarı́a como máximo el algoritmo más rápido de Euclides de las transparencias para calcular el máximo común divisor de 571 y 13? ¿Cuántas iteraciones utiliza cada uno de los dos algoritmos para calcularlo? Podéis modificar los programas de manera que cuenten el número de iteraciones que realizan para cada entrada. 7 Construid un programa que lea un número natural n y escriba el número harmónico n-ésimo Hn con cuatro cifras decimales (ver página 9 de Normes de Programació). La definición de Hn es la siguiente: si n = 0, entonces Hn = 0; en otro caso, Hn = 1/1 + 1/2 + . . . + 1/n. 8 En la página 20 del bloque de transparencias IP03 Loops se muestra un ejemplo en el que se pide calcular el máximo común divisor de una secuencia de pares de números enteros positivos. La diferencia con el ejemplo de contar a’s es que en este caso no hay un valor especial (e.g. el carácter ’.’) que marque el final de la secuencia. La forma de leer secuencias que terminan cuando los datos se acaban, es decir que no usan un valor especial para marcar el final de la secuencia, se explica en la página 5 del bloque de transparencias IP06 Sequences Invariants. Construid un programa que lea una secuencia de dı́gitos (como los que forman un número de DNI, por ejemplo) y escriba la secuencia de enteros formada por los cuadrados de cada dı́gito. Por ejemplo, si la secuencia de 2 entrada es 17238854 el programa debe escribir la secuencia de enteros 1, 49, 4, 9, 64, 64, 25, 16. Tened en cuenta que si introducı́s la secuencia 17238854 a través del teclado, no es necesario que separéis los dı́gitos con espacios en blanco entre ellos, pero después del 4 debéis presionar a la vez las teclas Ctrl y D para marcar el final de la entrada. ¿En qué se diferencia este ejercicio del problema de la lista 2 que pide escribir los dı́gitos de un número al revés? 9 Escribid un programa que utilice la onstrucción ’for’ y que dado un número natural n escriba en una lı́nea n veces el número n. Por ejemplo, si n = 7 el programa debe escribir 7777777 y si n = 4 4444 10 Modificad el programa anterior para que dado un natural n escriba un triángulo de n filas donde la primera fila contiene n veces el número n, la segunda fila n − 1 veces el número n − 1, y ası́ sucesivamente hasta la fila 1. Extended el programa anterior para que en lugar de leer un solo natural lea una secuencia de naturales, y el lugar de escribir un solo triángulo escriba una secuencia de triángulos separados por una lı́nea en blanco. 11 En la página 24 de IP03 Loops se hace una observación que va a ser muy importante en este curso: ser capaz de distinguir los problemas de R... de los problemas de B... Reescribid el algoritmo que determina si un número es primo de manera que dicha obervación pueda apreciarse. 12 Un problema relacionado con determinar si un número es primo es el de escribir la descomposición de un número dado en factores primos. ¿En qué bloque de transparencias hay un algoritmo que resuelve este último problema? 3 13 El algoritmo que determina si un número es perfecto en IP03 Loops podrı́a mejorarse utilizando la idea del algoritmo rápido para determinar si un número es primo. Construid un algoritmo más eficiente utilizando esa idea y responded a la pregunta de la página 38 sobre el algoritmo que aparece en las transparencias. 4