jueves, 24 de junio de 2021

Dart: Multiplicar sin utilizar el operador *

En este problema el entrevistador te pide que crees una programa donde puedas multiplicar 2 variables pero no puedes utilizar el operador *. Existen diferentes formas de solucionar este problema, en este artículo vamos a ver 2 de ellas.

Antes de resolver el problema deben recordar que en una entrevista de trabajo el entrevistador va tomar en cuenta varios aspectos por ejemplo el nombre de las variables, como organizas tu código, etc.


Solución 1

Esta, creo yo, es la solución más común y debemos entender cómo funciona la multiplicación: multiplicar una cantidad por un número consiste en sumar dicha cantidad tantas veces como indica el número​. Así, 4×3 es igual a sumar tres veces el número 4. En código puede quedar así:

final resultado = 4 + 4 + 4;

Si analizamos unos segundos podemos ver que para resolver esta prueba tenemos que utilizar un ciclo. En este caso la mejor opción es un for. Entonces podemos crear una función llamada multiplicar y tener algo así:

num multiplicar(num a, num b) {
	num resultado = 0;
	for (int i = 0; i < b; i++) {
		resultado += a;
	}
	return resultado;
}  

Pero hay un problema con el código anterior, solo funciona si ambos factores son números positivos. Si el entrevistador nos dice que también necesitamos soportar números negativos podemos revisar si b es negativo, en caso de que si sea negativo en vez de sumar vamos a restar. El codigo quedaria asi:

num multiplicar(num a, num b) {
	num resultado = 0;
	bool esNegativo = b < 0;

	for (int i = 0; i < b.abs(); i++) {
		resultado = esNegativo ? resultado - a : resultado + a;
	}
	return resultado;
}

Hay que notar que usamos la función b.abs() en la condición, porque si b fuera negativo la condición siempre sería falsa. Otra cosa que hay que notar es que para la variable a no hacemos ninguna verificación si es negativo, esto es porque al sumar 2 números negativos el resultado es negativo.

Puedes correr el código de la solución 1 en DartPad y jugar con las variables para ver los resultados:


Solución 2

Para esta solución hay que conocer sobre las reglas de fracciones. En específico la siguiente regla:

Si sustituimos el valor de b por un 1 nos quedaría la siguiente fórmula:

Como podemos ver la multiplicación de a * c es igual a a / (1/c), ahora con toda esta información nuestra función de multiplicar quedaria asi:

num multiplicar(num a, num c) {
	return a / (1 / c);
}

Pero hay un problema con el código anterior, porque cualquier número dividido entre cero va causar una excepción en el programa, por lo que si c es cero vamos a regresar 0 como resultado. El codigo quedaria asi:

num multiplicar(num a, num c) {
	return c == 0 ? 0 : a / (1 / c);
}

Puedes correr el código de la solución 2 en DartPad y jugar con las variables para ver los resultados:


Conclusión

Personalmente en la entrevista de trabajo que yo tuve utilice la solución 1 porque no sabía de memoria la regla de fracciones de la solución 2. Pero ahora que ya sabes la regla si en una entrevista te toca resolver este problema puedes utilizar la solución 2.

Si sabes otra forma de resolver este problema que sea más eficiente puedes dejarla en los comentarios.

Recuerda que también puedes ver el videotutorial de este curso en youtube:

    

1 comentario:

Entradas populares