Contenido
PalancaEjercicios corregidos sobre estructuras algorítmicas
Los siguientes ejercicios corregidos se relacionan con estructuras algorítmicas, estructuras de control y estructuras de datos. El objetivo es proponer las estructuras más adecuadas al enunciado.
Ejercicio 1
Considere los algoritmos a continuación.
(a) ¿Cuál será el contenido de las variables a, by posiblemente c después de su ejecución?
(b) En cada uno de los casos anteriores, ¿hay líneas innecesarias y, de ser así, cuáles?
En la mayoría de los lenguajes de programación, el último ejemplo (1.6) no generará un error, pero el resultado no suele ser '3'. Dependiendo del idioma, será la concatenación de estos caracteres en una cadena de caracteres “ab” (caso de los lenguajes Python o JavaScript), o incluso “a+b” (caso del shell) o la suma de los códigos ASCII correspondientes. a los caracteres ' 1' y '2', es decir 49 + 50 = 99: el carácter 'c' (caso de lenguajes C, C++ o Java). En muy pocos lenguajes, como PHP o perl, en cambio, el resultado será 3. Finalmente en otros lenguajes como pascal, que es un lenguaje fuertemente tipado, la compilación generará un error.
Ejercicio 2
Esta técnica de multiplicación, utilizada en el antiguo Egipto, no requiere conocer todas las tablas de multiplicar hasta el 10 sino solo la suma y la multiplicación por 2.
Aquí está por ejemplo la multiplicación de 13 por 78. Primero debes escribir la tabla de potencias de 2 menor o igual a 13. Luego, escribe la tabla de dobles del número 78.
Luego, tienes que marcar las mayores potencias de 2 descomponiendo el número 13 (es decir, que el bit binario es igual a 1). En otras palabras, marque las potencias de 2 ingresando la conversión binaria del número 13 = 1101
La suma es 78+312+624=1014.
a – Calcula el producto de tu elección utilizando el algoritmo de la división egipcia.
b – ¿Es más fácil calcular el producto de 78 por 13? Por qué ?
c – Escribe el algoritmo de multiplicación egipcio (¡según tu respuesta de b!). ¡Intenta optimizarlo lo mejor que puedas!
Lo más fácil es elegir el número más pequeño para la potencia de 2 y por lo tanto el número más grande a duplicar. Efectivamente, el número de iteraciones es igual al número de veces que es necesario multiplicar 2 por sí mismo para que sea mayor que el número menos una iteración (solo mantenemos lo estrictamente inferior. Tendremos por tanto un número d iteración n tal que 2no > a (número descrito). Deducimos que n>log2(a) de ahí el interés de que a sea el más pequeño.
Primero recordamos la transformación binaria de un número decimal.
Lo que da el siguiente algoritmo:
No es necesario utilizar una variable temporal para intercambiar dos valores. Aquí hay otra versión del algoritmo:
Ejercicio 3
a – Escribe un algoritmo cuyos parámetros son tres variables reales y que permuta circularmente sus valores.
b – Escribir un algoritmo cuyos parámetros sean tres variables reales y devuelva el valor máximo entre estos tres valores.
c – Escribir un algoritmo que permita los valores de dos variables sin utilizar una variable adicional.
d – Escriba un algoritmo que devuelva verdadero si dos números enteros a y b tienen el mismo signo, de lo contrario falso
posee - Las variables a, b y c son variables definidas fuera del algoritmo. Estos valores se modifican aunque no se devuelva nada. ¡Presta atención al orden de tus operaciones!
También puede hacer esto sin tomar una variable adicional. En este caso tendremos al principio (a,b,c). Por ejemplo, a y b se intercambian mediante las siguientes operaciones:
un ← un + b
b ← a–b
a ← a–b
Tenemos por tanto el triple de valores (b,a,c). Resta intercambiar a y c para obtener el triple (b,c,a).
O también puedes intercambiar los tres valores usando una serie de cálculos.
a ← a + b + c;
c ← a–b–c;
b ← a–b–c;
a ← a–b–c;
b- Aquí el algoritmo debe devolver un valor, por lo que hay entradas y salidas. Hay muchas formas de hacer las cosas, depende de ti encontrar variantes (con varias condiciones en la rama, por ejemplo).
La idea sería devolver el máximo sin usar variables adicionales.
Tampoco es muy bonito allí, por lo que intentaremos devolver el máximo solo una vez sin usar nuevas variables. Permutaremos los valores para almacenar el máximo en x (ojo, dependiendo de los idiomas puedes tener un impacto real en los valores en xy y z, ¡así que utilízalo con precaución!)
vs- Lo acabamos de hacer varias veces... para aquellos que no han seguido.
d- Pensaremos en un algoritmo bien optimizado para evitar hacer muchas ramas. ¡Dos números enteros con el mismo signo tendrán su producto positivo! (0 es tanto positivo como negativo)
Ejercicio 4
Escriba un algoritmo para resolver cada uno de los siguientes problemas: (pruebe con diferentes estructuras de control FOR, WHILE, DO… WHILE, etc.).
1- Cálculo de la suma de los primeros N enteros.
2- Encontrar el mínimo y el máximo en un conjunto de N números.
3- Cálculo del cociente y resto de la división de dos enteros A y B sin utilizar la operación de división.
4- El cálculo del producto de dos números enteros utilizando únicamente la operación de suma '+'.
5- Determinación si A es divisible por B. Con A y B enteros positivos.
6- Determinar todos los divisores de un entero X dado.
7- Determinar si un entero X es primo o no.
8- Calcular la suma de las cifras que forman un número natural N.
9- Una tienda de reprografía cobra 2 euros por las diez primeras fotocopias, 1,50 euros por las veinte siguientes y 1 euro más.
10- Escribe un algoritmo para mostrar la estación introduciendo el número del mes.
Errata: al principio R = N, en caso contrario el algoritmo no hace nada (decimos que no es correcto porque no resuelve el problema planteado).
9-
Es posible poner las ramas en secuencia, pero eso es menos eficiente en el tiempo de cálculo.
10-
Ejercicio 5
1. Escriba un algoritmo que solicite al usuario un número entero, pruebe si ese número es positivo (0) o no y muestre "positivo" o "negativo".
2. Escriba un algoritmo que solicite al usuario un número entero, pruebe si ese número es estrictamente positivo, cero o estrictamente negativo y muestre ese resultado.
3. Escribir un algoritmo que solicite al usuario un valor real y muestre su valor absoluto (obviamente sin utilizar una función predefinida).
4. Escriba un algoritmo que solicite un número real al usuario y lo redondee al entero más cercano (x.5 se redondeará al siguiente entero).
5. Escriba un algoritmo que solicite el número de un mes y muestre el número de días de ese mes (ignorando los años bisiestos).
6. Escribe un algoritmo que verifique si un año es bisiesto. Recuerde que hay años bisiestos cada 4 años, pero el primer año de un siglo no lo es (1800, 1900 no fueron años bisiestos) excepto cada 400 años (2000 fue año bisiesto).
7. Escriba un algoritmo que solicite una fecha en forma de 2 números enteros (número de día y número de mes) y muestre la temporada (por ejemplo: 12/02; invierno). Se asumirá que el primer día de la temporada es siempre el 21.
8. Escribe un programa que solicite las coordenadas (x, y) de los vértices A, B y C de un triángulo y muestre la naturaleza del triángulo (isosceles, equilátero, rectangular o cualquiera).
Ejercicio 6
1. Escriba un algoritmo que solicite un número entero positivo y lo rechace hasta que el número ingresado no coincida.
2. Escriba un algoritmo que solicite 10 números enteros, cuente el número de enteros positivos ingresados y muestre ese resultado.
3. Escriba un algoritmo que solicite al usuario números enteros positivos, los agregue y deje de mostrar el
resultado tan pronto como se ingresa un número entero negativo.
4. Modifique este último algoritmo para mostrar el promedio de la serie de números enteros positivos ingresados.
1-
2-
3-
4-
Ejercicio 7
Escriba un algoritmo para mostrar los primeros n términos de las siguientes secuencias (n solicitadas al usuario):
Ejercicio 8
Escribe un algoritmo que calcule los primeros n números primos.
Ejercicio 9
Ejercicio 10
Se dice un entero positivo Perfecto si es igual a la suma de sus divisores (excepto él mismo). Por ejemplo 6 es perfecto, porque 6 = 1 + 2 + 3; de manera similar, 28 es perfecto, porque 28 = 1 + 2 + 4 + 7 + 14.
Escribe una función booleana perfecta para un número entero n. Para optimizar.
Realiza un procedimiento perfect_riddle que busque y muestre, utilizando un tamiz, los números perfectos en un intervalo del 1 al METRO .
Planeamos almacenar para cada número entero la suma de sus divisores, suma que se calculará durante la criba: el principio de la criba es, para cada número entero I del intervalo, para recorrer los múltiplos de I al que le sumamos el divisor I.
Aquí hay un algoritmo bastante simple para encontrar un número perfecto.
También podemos inicializar s a 1 e iniciar el ciclo en 2, pero tenga cuidado, la función debe devolver falso para I = 1; Luego debemos agregar una prueba a la inicialización.
Podemos optimizar la función observando que si I dividir no, entonces (no div I) también es divisor ya que I (no div I) = no.
solo varía I de 2 a √no : si I es un divisor, entonces el divisor (no div I) está en el intervalo √no Para no ; entonces tenemos todos los divisores.
Hay que pensar en empezar por 2 para no sumar no. También hay un problema si no es un cuadrado: habremos sumado el divisor dos veces r = √no.
Aquí hay un algoritmo para perfect_screen:
Los números perfectos entre 1 y 10.000.000 son 6, 28, 496, 8128.
Ejercicio 11
Escriba una función que devuelva el número de apariciones del valor máximo presente en una matriz sin clasificar. Construya el algoritmo en 0(n).
Es posible hacerlo como dos tiempos, tendremos un complejidad de 2n=O(n)
O hacer todo en un solo bucle:
Ejercicio 12
consideramos un cuadrado Q en el que se colocan aleatoriamente un gran número de puntos. La relación entre el número de puntos que aparecen en el círculo inscrito en Q y el número de puntos dibujados se acerca a la relación entre la superficie del disco inscrita en Q y la superficie del cuadrado Q. Deducimos un valor aproximado de π. Este método se llama simulación de Monte Carlo (¡muy útil en finanzas!).
Es decir r el radio del círculo. El área del círculo es πr2 y el área del cuadrado es 4r2. Para simplificar tomamos r = 1, y nos limitamos al cuarto de plano R+ ×R+ .
random(m) proporciona un número entero entre 0 y metro-1, mientras que aleatorio sin parámetros proporciona un real entre 0 y 1.
Para saber si un punto (x, y) ∈ en el cuarto de círculo probamos si √(X² + y²) ≤ 1.
Como calcular la raíz cuadrada es caro, simplemente hacemos la prueba equivalente (X² + y²) ≤ 1. Para esto podemos usar la función sqr que está más optimizada que x*x.
no es el número total de puntos extraídos (todos en el cuarto de casilla); vs es el número de estos puntos que hay en el cuarto de círculo.