1 00:00:00,000 --> 00:00:05,799 Escuchando, everything, perfecto. 2 00:00:05,839 --> 00:00:08,179 Y no escuchando, a tomar por saco de aquí. 3 00:00:08,939 --> 00:00:10,619 Venga, perfecto. 4 00:00:11,199 --> 00:00:14,099 Vale, pues vamos a retrotraernos a la versión más sencilla, 5 00:00:14,720 --> 00:00:16,539 que es el ejercicio 8 sin más. 6 00:00:18,440 --> 00:00:22,339 Vamos a hacer una función a la que se le pasa un número entero 7 00:00:22,339 --> 00:00:25,239 y devuelve el número de divisores primos que tiene, 8 00:00:25,399 --> 00:00:26,500 los cuentas sin más. 9 00:00:26,500 --> 00:00:28,500 por ahora vamos a empezar la 8 10 00:00:28,500 --> 00:00:30,780 olvidándonos de la 7 11 00:00:30,780 --> 00:00:32,500 de todo por ahora, la 8 tal cual 12 00:00:32,500 --> 00:00:34,759 venga, pues entonces vamos a hacer una función 13 00:00:34,759 --> 00:00:35,159 que 14 00:00:35,159 --> 00:00:38,700 como me va a devolver el resultado 15 00:00:38,700 --> 00:00:39,619 de una cuenta 16 00:00:39,619 --> 00:00:42,759 pues lo que me va a devolver 17 00:00:42,759 --> 00:00:43,320 es un entero 18 00:00:43,320 --> 00:00:46,700 eso sí o sí, me va a devolver el resultado 19 00:00:46,700 --> 00:00:47,299 de una cuenta 20 00:00:47,299 --> 00:00:50,420 y ahora que va a hacer esa función 21 00:00:50,420 --> 00:00:52,659 cuenta divisores 22 00:00:52,659 --> 00:00:53,340 primos 23 00:00:53,340 --> 00:00:55,079 vale 24 00:00:55,079 --> 00:00:57,640 y esos divisores primos 25 00:00:57,640 --> 00:00:59,799 ¿de quién van a ser? 26 00:00:59,880 --> 00:01:00,700 ¿de quién los va a contar? 27 00:01:01,340 --> 00:01:03,039 de un número cualquiera 28 00:01:03,039 --> 00:01:04,120 de un número entero 29 00:01:04,120 --> 00:01:06,560 pues entonces el parámetro 30 00:01:06,560 --> 00:01:08,439 va a ser un número entero 31 00:01:08,439 --> 00:01:10,739 vale, esta es la cabecera de nuestra función 32 00:01:10,739 --> 00:01:11,620 bueno 33 00:01:11,620 --> 00:01:14,219 lo que tenemos que hacer es una cuenta 34 00:01:14,219 --> 00:01:15,060 tenemos que contar 35 00:01:15,060 --> 00:01:17,659 pues ya está, como tenemos que hacer una cuenta 36 00:01:17,659 --> 00:01:19,340 empezamos con un contador 37 00:01:19,340 --> 00:01:20,500 a cero 38 00:01:20,500 --> 00:01:22,980 porque lo que vamos es a contar 39 00:01:22,980 --> 00:01:26,379 y ahora siempre que hay una cuenta 40 00:01:26,379 --> 00:01:28,359 involucrada o una suma acumulativa 41 00:01:28,359 --> 00:01:29,599 lo que sea, hay un bucle 42 00:01:29,599 --> 00:01:32,099 que va pasando por todo aquello 43 00:01:32,099 --> 00:01:33,439 que tenemos que contar, un bucle 44 00:01:33,439 --> 00:01:35,299 vale, pues este bucle 45 00:01:35,299 --> 00:01:38,159 en este caso en particular, ¿por qué va a pasar? 46 00:01:38,760 --> 00:01:39,939 por todos los números 47 00:01:39,939 --> 00:01:41,739 comprendidos entre 1 y n 48 00:01:41,739 --> 00:01:44,519 porque n de tener divisores 49 00:01:44,519 --> 00:01:46,299 estarán entre 1 y n 50 00:01:46,299 --> 00:01:47,640 serán menores que él, obviamente 51 00:01:47,640 --> 00:01:50,500 todos los divisores de un número son números más pequeños que él 52 00:01:50,500 --> 00:01:52,280 entonces nuestro 53 00:01:52,280 --> 00:01:54,260 bucle va a pasar entre todos los números 54 00:01:54,260 --> 00:01:55,260 entre 1 y n 55 00:01:55,260 --> 00:01:58,340 para contar cuáles 56 00:01:58,340 --> 00:02:00,439 de ellos son divisores 57 00:02:00,439 --> 00:02:02,340 y además de ser divisores 58 00:02:02,340 --> 00:02:04,099 son primos, porque eso es lo que hay que contar. 59 00:02:04,340 --> 00:02:05,879 ¿Vale? Bueno, pues 60 00:02:05,879 --> 00:02:08,259 repito desde el principio, cuando tenemos una 61 00:02:08,259 --> 00:02:10,300 cuenta, tenemos que centrarnos primero 62 00:02:10,300 --> 00:02:12,280 esa cuenta, donde está la 63 00:02:12,280 --> 00:02:14,319 colección de valores por la que va 64 00:02:14,319 --> 00:02:15,659 a pasar, por la que va a navegar. 65 00:02:16,240 --> 00:02:18,120 Pues en este caso esta cuenta va a pasar 66 00:02:18,120 --> 00:02:20,159 por todos los valores comprendidos 67 00:02:20,159 --> 00:02:22,159 entre 1 y n, porque 68 00:02:22,159 --> 00:02:25,240 que de haber divisores primos estarán ahí, entre 1 y n, de haberlos. 69 00:02:25,659 --> 00:02:27,620 Pues entonces ese bucle va a pasar entre 1 y n. 70 00:02:28,099 --> 00:02:31,759 Pues un bucle que va pasando entre 1 y n, lo más cómodo es hacerlo con un for, 71 00:02:32,080 --> 00:02:36,819 porque ya tenemos una variable índice que la podemos hacer pasar, viajar. 72 00:02:37,379 --> 00:02:43,360 Desde 1, mientras i sea menor o igual que n, incrementando i, 73 00:02:43,479 --> 00:02:49,300 ya tenemos un bucle que ya hemos conseguido que vaya viajando por todos los números entre 1 y n. 74 00:02:49,300 --> 00:02:57,340 Y ahora, para cada uno de esos números, tenemos que incrementar la cuenta si cumple qué condición. 75 00:02:58,199 --> 00:03:01,159 Ser primo y ser divisor de n, las dos a la vez. 76 00:03:02,639 --> 00:03:14,650 Entonces, vamos a incrementar la cuenta, es decir, la cuenta se va a quedar incrementada si se cumple dos cosas a la vez. 77 00:03:15,189 --> 00:03:15,770 Luego, un and. 78 00:03:18,699 --> 00:03:21,780 ¿Qué dos cosas se tienen que cumplir para que incrementemos la cuenta? 79 00:03:22,620 --> 00:03:24,599 Que I sea divisor de N. 80 00:03:25,620 --> 00:03:27,500 Eso es muy fácil de expresar. 81 00:03:29,719 --> 00:03:33,860 Que I divida a N de forma exacta. 82 00:03:34,120 --> 00:03:36,479 Que el resto de dividir en entre I sea igual a cero. 83 00:03:37,180 --> 00:03:38,819 Esta condición es muy fácil de expresar. 84 00:03:39,960 --> 00:03:43,039 Esta es la condición de I es divisor de N. 85 00:03:44,020 --> 00:03:47,979 Y la otra tiene que ser que I sea primo. 86 00:03:48,699 --> 00:03:50,280 Pero claro, I es primo. 87 00:03:50,280 --> 00:03:53,379 como ponemos esa condición 88 00:03:53,379 --> 00:03:55,360 no la podemos expresar de golpe y por raza 89 00:03:55,360 --> 00:03:56,219 tan sencilla 90 00:03:56,219 --> 00:03:59,419 pero no pasa nada, tenemos una función 91 00:03:59,419 --> 00:04:01,319 y si no la tenemos, que yo aquí en este código 92 00:04:01,319 --> 00:04:02,960 no la tengo, la hacemos en un pispás 93 00:04:02,960 --> 00:04:04,680 que es volver a hacerla 94 00:04:04,680 --> 00:04:07,319 que he dado un numerito, me devuelve un boolean 95 00:04:07,319 --> 00:04:09,240 diciéndome si es primo o no, ah pues estupendo 96 00:04:09,240 --> 00:04:10,280 vamos a 97 00:04:10,280 --> 00:04:12,439 hacernos esa función 98 00:04:12,439 --> 00:04:14,800 porque si yo la tengo hecha 99 00:04:14,800 --> 00:04:17,639 una función que me devuelve un boolean 100 00:04:17,639 --> 00:04:19,199 true si es primo 101 00:04:19,199 --> 00:04:21,560 y falsa si no lo es, si la tuviera 102 00:04:21,560 --> 00:04:23,420 hecha, magnífico, porque ya 103 00:04:23,420 --> 00:04:24,579 tengo la condición completa 104 00:04:24,579 --> 00:04:26,279 i es divisor 105 00:04:26,279 --> 00:04:29,459 e i es primo, como se cumplen 106 00:04:29,459 --> 00:04:30,579 las dos, cuento 107 00:04:30,579 --> 00:04:33,319 y esa cuenta la extiendo a todos 108 00:04:33,319 --> 00:04:34,660 y cada uno de los candidatos 109 00:04:34,660 --> 00:04:37,379 ¿vale? los candidatos cuáles son 110 00:04:37,379 --> 00:04:38,660 los comprendidos entre 1 y n 111 00:04:38,660 --> 00:04:41,240 porque no puede haber divisores por encima de n 112 00:04:41,240 --> 00:04:43,560 vale, pues lo único que nos falta aquí 113 00:04:43,560 --> 00:04:45,560 esto cuando esté hecho, pues devolveremos 114 00:04:45,560 --> 00:04:46,620 la cuenta y se acabó 115 00:04:46,620 --> 00:04:49,800 lo único que nos falta aquí es 116 00:04:49,800 --> 00:04:51,100 hacer la función es primo 117 00:04:51,100 --> 00:04:52,139 vale 118 00:04:52,139 --> 00:04:55,779 pues la función es primo 119 00:04:55,779 --> 00:05:02,560 es una función a la que le paso 120 00:05:02,560 --> 00:05:04,339 un número, la hemos hecho 121 00:05:04,339 --> 00:05:06,420 antes y pues 122 00:05:06,420 --> 00:05:08,819 lo hacemos rápidamente, asumimos de partida 123 00:05:08,819 --> 00:05:09,899 que 124 00:05:09,899 --> 00:05:12,639 hacemos un boolean y asumimos de partida 125 00:05:12,639 --> 00:05:13,740 que no es primo 126 00:05:13,740 --> 00:05:15,480 perdón, que es primo 127 00:05:15,480 --> 00:05:18,240 y luego ya, vamos a ver si 128 00:05:18,240 --> 00:05:20,339 encontramos algún número inferior 129 00:05:20,339 --> 00:05:22,000 a él que lo divida de forma exacta 130 00:05:22,000 --> 00:05:23,500 que no sea 1 y el propio número 131 00:05:23,500 --> 00:05:26,300 en cuanto encontremos uno que lo divida de forma exacta 132 00:05:26,300 --> 00:05:27,699 ya podemos cambiar de idea y hacer 133 00:05:27,699 --> 00:05:28,620 exprimo a 134 00:05:28,620 --> 00:05:32,240 falso, esto entonces sería 135 00:05:32,240 --> 00:05:33,120 pues vamos a 136 00:05:33,120 --> 00:05:36,139 navegar por todos los candidatos 137 00:05:36,139 --> 00:05:37,040 entre 2 138 00:05:37,040 --> 00:05:40,040 y num-1 139 00:05:40,040 --> 00:05:46,050 vamos a navegar por todos los 140 00:05:46,050 --> 00:05:47,870 candidatos entre 2 y num-1 141 00:05:47,870 --> 00:05:49,870 y si alguno de ellos 142 00:05:49,870 --> 00:05:52,189 solo con que alguno de ellos 143 00:05:52,189 --> 00:05:54,930 divida de forma exacta a num 144 00:05:54,930 --> 00:06:00,120 ya podemos cambiar de idea 145 00:06:00,120 --> 00:06:02,019 perdona, he encontrado un divisor 146 00:06:02,019 --> 00:06:02,899 he encontrado uno 147 00:06:02,899 --> 00:06:05,899 entre 2 y num-1, he encontrado uno 148 00:06:05,899 --> 00:06:07,620 pues es primo o false 149 00:06:07,620 --> 00:06:09,819 ya puedo concluir que es primo o false, cambio de idea 150 00:06:09,819 --> 00:06:12,040 y ahora ya me falta 151 00:06:12,040 --> 00:06:15,420 sí, entonces 152 00:06:15,420 --> 00:06:17,600 aquí lo podríamos dejar así, es decir 153 00:06:17,600 --> 00:06:18,879 cuando el for ha terminado 154 00:06:18,879 --> 00:06:21,560 pues devuelvo ya mi resultado final 155 00:06:21,560 --> 00:06:22,220 es primo 156 00:06:22,220 --> 00:06:27,279 así es como queda más estructurada 157 00:06:27,279 --> 00:06:29,620 cuando ya este for ha acabado 158 00:06:29,620 --> 00:06:34,100 no pongo llaves porque tanto el if solo tiene una sentencia 159 00:06:34,100 --> 00:06:35,699 como el for solo tiene una, que es esta 160 00:06:35,699 --> 00:06:38,439 cuando ya el for ha acabado 161 00:06:38,439 --> 00:06:41,040 devuelvo a spring 162 00:06:41,040 --> 00:06:45,759 cuando hicimos esta función creo que efectivamente 163 00:06:45,759 --> 00:06:49,399 en cuanto encontramos un divisor ya pusimos aquí el return 164 00:06:49,399 --> 00:06:52,279 claro, porque el retun 165 00:06:52,279 --> 00:06:54,100 significa, acaba la función 166 00:06:54,100 --> 00:06:55,620 y devuelve el valor que sea 167 00:06:55,620 --> 00:06:58,259 entonces, podríamos haber 168 00:06:58,259 --> 00:07:00,259 en lugar de eso, haber 169 00:07:00,259 --> 00:07:01,699 hecho aquí, retun falso 170 00:07:01,699 --> 00:07:03,579 que es, he encontrado un divisor 171 00:07:03,579 --> 00:07:06,399 acaba ya la función, no hagas más cosas, retun falso 172 00:07:06,399 --> 00:07:07,620 me sacas falso y ya está 173 00:07:07,620 --> 00:07:08,819 ¿vale? 174 00:07:09,639 --> 00:07:11,920 pero bueno, vamos a dejarla así 175 00:07:11,920 --> 00:07:14,120 por si a alguien le queda más clara 176 00:07:14,120 --> 00:07:15,519 ¿vale? pues ya está hecho 177 00:07:15,519 --> 00:07:17,420 ya hemos conseguido esta función 178 00:07:17,420 --> 00:07:19,240 luego la función de arriba 179 00:07:19,240 --> 00:07:20,740 se apoya en esta otra 180 00:07:20,740 --> 00:07:22,860 para construir 181 00:07:22,860 --> 00:07:23,899 esta condición doble 182 00:07:23,899 --> 00:07:25,000 si el numerito 183 00:07:25,000 --> 00:07:25,620 es primo 184 00:07:25,620 --> 00:07:26,560 y además lo divide 185 00:07:26,560 --> 00:07:27,100 ala 186 00:07:27,100 --> 00:07:27,839 cuento 187 00:07:27,839 --> 00:07:28,980 te cuento 188 00:07:28,980 --> 00:07:30,319 y hago eso 189 00:07:30,319 --> 00:07:31,560 para todos los candidatos 190 00:07:31,560 --> 00:07:32,519 entre 1 y n 191 00:07:32,519 --> 00:07:33,959 una vez que he acabado 192 00:07:33,959 --> 00:07:34,579 la cuenta 193 00:07:34,579 --> 00:07:36,019 devuelvo cont 194 00:07:36,019 --> 00:07:37,139 y ya está 195 00:07:37,139 --> 00:07:40,980 primos 196 00:07:40,980 --> 00:07:43,000 el número de divisores 197 00:07:43,000 --> 00:07:44,439 que además son primos 198 00:07:44,439 --> 00:07:45,240 porque esto es un and 199 00:07:45,240 --> 00:07:47,759 o sea si tú le quitas esto 200 00:07:47,759 --> 00:07:49,639 te cuenta sus divisores 201 00:07:49,639 --> 00:07:52,519 pero con eso solo te está contando 202 00:07:52,519 --> 00:07:54,060 los que además de ser divisores 203 00:07:54,060 --> 00:07:55,620 son números primos 204 00:07:55,620 --> 00:07:57,259 ¿vale? por ejemplo 205 00:07:57,259 --> 00:07:59,300 el 206 00:07:59,300 --> 00:08:01,600 el 20 207 00:08:01,600 --> 00:08:03,680 el 20 por ejemplo 208 00:08:03,680 --> 00:08:06,180 el 10 es un divisor de 20 ¿verdad? 209 00:08:06,800 --> 00:08:07,779 pero el 10 no es primo 210 00:08:07,779 --> 00:08:09,560 con lo cual no lo contaría 211 00:08:09,560 --> 00:08:12,740 ¿vale? por ejemplo, ahora vamos a llamar a esta función 212 00:08:12,740 --> 00:08:13,699 pasándole 20 213 00:08:13,699 --> 00:08:15,319 para ver cuántos me ha contado 214 00:08:15,319 --> 00:08:19,120 Los divisores primos de 20 215 00:08:19,120 --> 00:08:23,410 Bueno, 5 es divisor de 20 y es primo 216 00:08:23,410 --> 00:08:25,089 El 5 lo contará, el 2 también 217 00:08:25,089 --> 00:08:30,569 Vamos a mostrar cuántos divisores primos tiene 20 218 00:08:30,569 --> 00:08:41,980 Pues vamos a ver cuántos divisores primos tiene 20 219 00:08:41,980 --> 00:08:42,980 Lo ejecutamos 220 00:08:42,980 --> 00:08:44,259 Tiene 3 221 00:08:44,259 --> 00:08:46,019 20 tiene 3 222 00:08:46,019 --> 00:08:49,659 Que serán el 5, el 2 223 00:08:49,659 --> 00:08:52,500 Y el otro divisor primo de 20 224 00:08:52,500 --> 00:08:54,419 Que no es el 5 ni el 2 225 00:08:54,419 --> 00:08:55,740 ¿Cuál es? 226 00:08:56,240 --> 00:08:57,539 Porque 20 es 227 00:08:57,539 --> 00:08:59,679 4 228 00:08:59,679 --> 00:09:02,419 No, el 4 no es primo 229 00:09:02,419 --> 00:09:03,600 Ah, no, primo 230 00:09:03,600 --> 00:09:05,460 Claro, ¿cuántos divisores primos de 20? 231 00:09:05,840 --> 00:09:07,120 20 tiene como divisores 232 00:09:07,120 --> 00:09:10,580 El 2, el 4, el 5 233 00:09:10,580 --> 00:09:14,840 Porque 20 es 234 00:09:14,840 --> 00:09:16,039 10 por 2 235 00:09:16,039 --> 00:09:18,039 ¿Qué es 5? 5 por 2 236 00:09:18,039 --> 00:09:20,360 Solo tiene 5 y 2 237 00:09:20,360 --> 00:09:21,639 ¿Dos divisores primos? 238 00:09:21,740 --> 00:09:23,320 El 5 y el... 239 00:09:23,320 --> 00:09:26,659 Claro, 1, 2, 4, 5, 10 y 20. 240 00:09:26,879 --> 00:09:28,720 Ah, bueno, claro, claro, vale, vale, vale. 241 00:09:28,840 --> 00:09:32,279 Es que estoy, claro, me está contando efectivamente el 1. 242 00:09:32,659 --> 00:09:34,179 Claro, porque aquí he empezado desde el 1. 243 00:09:35,820 --> 00:09:38,120 Sí, claro, tal y como yo lo he hecho me está contando el 1. 244 00:09:38,980 --> 00:09:40,919 Vale, el 20 no me lo cuenta porque el 20 no es primo. 245 00:09:41,919 --> 00:09:45,220 Vale, entonces me está contando el 1, el 2 y el 5. 246 00:09:46,080 --> 00:09:46,279 ¿Vale? 247 00:09:48,440 --> 00:09:48,759 Vale. 248 00:09:49,299 --> 00:09:50,820 Con la de Juan te hice los números. 249 00:09:51,460 --> 00:09:51,740 Claro. 250 00:09:53,320 --> 00:09:54,320 vale 251 00:09:54,320 --> 00:10:01,149 la perecilla, ¿no? 252 00:10:01,610 --> 00:10:02,590 vale, dudas