El problema consta de una matriz en la cúal hemos eliminado elementos, los elementos restantes los queremos pasar a una matriz nueva pero que este lo más cuadrada posible (no se si me explico)y deben sobrar un número minimo de espacios de esta matriz.
En la solucíon que doy, los números maximos de casillas restantes llegan hasta 2.
Empecemos!
La solución que doy se podría escribir en pseudocodigo de la siguiente manera:
N=numeros a imprimir
Sqrt(N)=flotante(x);
Sqrt(N)=entero(y);
if(x==y){
hacer arreglo cuadrado perfecto de "y*y"
else;
sqrt(N)=a;
N/a=b;
a*b=c;
c - N = d
if(d<=2){
arreglo a*b seria el optimo
arreglo a*b sería el optimo
//como se ve, el final con una simple resta y suma tendriamos el resultado 15x19 = 285, esta sería una matriz optima para nuestros 284 datos y como vimos no se pasa de los 2 espacios.
otro ejemplo:
Tenemos 22 números que queremos pasar a la nueva matriz, entonces:
N=22;
Sqrt(22)=4.6; //que será nuestro variable flotante "x"
Sqrt(22)=4; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(22)= 4 //valor entero que será la variable "a"
22/4 = 5+ 1 = 6 //valor entero que será la variable "b"
4*6 = 24 //valor entero que será nuestra varable "c"
24 - 22 = 2 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final
else;
do{
a-1=a;
b+1=b;
a*b = c;
c - N = d;
}while(d>2)
arreglo a*b seria el optimo
Ejemplo:
Tenemos 284 números que queremos pasar a la nueva matriz, entonces:
N=284;
Sqrt(284)=16.85; //que será nuestro variable flotante "x"
Sqrt(284)=16; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(284)= 16 //valor entero que será la variable "a"
284/16 = 17+ 1 = 18 //valor entero que será la variable "b"
16*18 = 288 //valor entero que será nuestra varable "c"
284 - 288 = 4 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final
arreglo a*b sería el optimo //esto se ignora
else;
do{
16-1 = 15 //esto será la nuevo variable "a"
18+1 = 19 //esto será la nueva variable "b"
15*19 = 285;
285 - 284 = 1 //este sería nuestro valor "d"
}while(d>2)
arreglo a*b sería el optimo
//como se ve, el final con una simple resta y suma tendriamos el resultado 15x19 = 285, esta sería una matriz optima para nuestros 284 datos y como vimos no se pasa de los 2 espacios.
otro ejemplo:
Tenemos 22 números que queremos pasar a la nueva matriz, entonces:
N=22;
Sqrt(22)=4.6; //que será nuestro variable flotante "x"
Sqrt(22)=4; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(22)= 4 //valor entero que será la variable "a"
22/4 = 5+ 1 = 6 //valor entero que será la variable "b"
4*6 = 24 //valor entero que será nuestra varable "c"
24 - 22 = 2 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final
arreglo a*b sería el optimo //este sería nuestro arreglo más optimo
else;
do{
4-1 = 3 //se ignora
6+1 = 7 //se ignora
3*7 = 21
21-22 = -1;
}while(d>2);
//la suma y resta del final se ignora, sino tendriamos una matriz 3*7 = 21 y no cumpliriamos con la matriz más optima
Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" no pasa de los 2 espacios, no realizamos nunguna suma y resta a la matriz, y nos saldria directamente la más optima.
Ultimo ejemplo:
Tenemos 25 números que queremos pasar a la nueva matriz, entonces:
N=25;
Sqrt(25)=5; //que será nuestro variable flotante "x"
Sqrt(25)=5; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra positiva la afirmación
hacer arreglo cuadrado y*y //esta sería nuestra matriz más optima
//todo lo demas se ignora
Como vimos en el ejemplo, como al raiz cuadrada de los elementos da un numero entero, nuestra matriz puede ser perfectamente cuadrada.
Ejemplo Bonus con número al azar:
Tenemos 159 números que queremos pasar a la nueva matriz, entonces:
N=159;
Sqrt(159)=12.60; //que será nuestro variable flotante "x"
Sqrt(159)=12; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(159)= 12 //valor entero que será la variable "a"
159/12 = 13 + 1 = 14 //valor entero que será la variable "b"
12*14 = 168 //valor entero que será nuestra varable "c"
168 - 159 = 9 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final
//la suma y resta del final se ignora, sino tendriamos una matriz 3*7 = 21 y no cumpliriamos con la matriz más optima
Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" no pasa de los 2 espacios, no realizamos nunguna suma y resta a la matriz, y nos saldria directamente la más optima.
Ultimo ejemplo:
Tenemos 25 números que queremos pasar a la nueva matriz, entonces:
N=25;
Sqrt(25)=5; //que será nuestro variable flotante "x"
Sqrt(25)=5; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra positiva la afirmación
hacer arreglo cuadrado y*y //esta sería nuestra matriz más optima
//todo lo demas se ignora
Como vimos en el ejemplo, como al raiz cuadrada de los elementos da un numero entero, nuestra matriz puede ser perfectamente cuadrada.
Ejemplo Bonus con número al azar:
Tenemos 159 números que queremos pasar a la nueva matriz, entonces:
N=159;
Sqrt(159)=12.60; //que será nuestro variable flotante "x"
Sqrt(159)=12; //que será nuestro variable entero en "y"
if(x==y){ //realizamos una comparación, en este caso saldra negativa la afirmación
hacer arreglo cuadrado y*y //esto se ignora
else;
Sqrt(159)= 12 //valor entero que será la variable "a"
159/12 = 13 + 1 = 14 //valor entero que será la variable "b"
12*14 = 168 //valor entero que será nuestra varable "c"
168 - 159 = 9 //este será nuestra variable "d"
if(d<=2){ //esto es para saber si realizar la suma y resta del final
arreglo a*b sería el optimo //esto se ignora
else;
do{
12-1 = 11;
14+1 = 15;
11*15 = 165;
165 - 159 = 6; // en este caso sera 165, entonces tendriamos que hacer las operaciones otra vez }while(d>2);
10*16 = 160 //en la siguiente vuelta sadria estos resultados, este sería nuestro optimo
Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" pasa de los 2 espacios, realizamos otra suma y resta a la matriz, y hasta que nos salga la más optima.
Actualización**: modifique la solucion original ya que salian algunos inconvenientes, este debe de funcionar al 100%, no lo he probado con todos los números, si hay algun error hacermelo saber, para modificar la solución.
Aclaro, es una solución personal que surgio, puede estar mal como puede estar bien, es de humanos equivocarse.
En realidad hay otra solución a partir de esta en que saldrian los valores más directos y modificando unas cuantas lineaa, pero no dare todo en bandeja de plata, hay que pensar gente!!
Espero que les haya ayudado, Saludos!
10*16 = 160 //en la siguiente vuelta sadria estos resultados, este sería nuestro optimo
Como vimos en el ejemplo, como la multiplicacion de las variables "a" y "b" pasa de los 2 espacios, realizamos otra suma y resta a la matriz, y hasta que nos salga la más optima.
Actualización**: modifique la solucion original ya que salian algunos inconvenientes, este debe de funcionar al 100%, no lo he probado con todos los números, si hay algun error hacermelo saber, para modificar la solución.
Aclaro, es una solución personal que surgio, puede estar mal como puede estar bien, es de humanos equivocarse.
En realidad hay otra solución a partir de esta en que saldrian los valores más directos y modificando unas cuantas lineaa, pero no dare todo en bandeja de plata, hay que pensar gente!!
Espero que les haya ayudado, Saludos!