sábado, 7 de mayo de 2011

Optimización de matriz

Bueno esta entrada es meramente educativa, no es un programa solo es una solucíon a un problema de matrices.
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
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
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!

martes, 3 de mayo de 2011

Comparación de números

Es un programa sencillo que hice solo para un ejemplo.
El programa Recibe números en un vector A[i] (que sera nuestro universo), luego en un vector B[j] introduciremos los datos que queramos comprar con el vector A[i] para encontrar coincidencias y al final solo imprimimos

#include

int main(){
int N, n, j, i, cont;
printf("numeros a ingresar: ");
scanf("%d", &N);
int A[N];
for(i=0;i(<)N;i++){
printf("número A[%d] = ", i);
scanf("%d", &A[i]);
}
printf("cuantos números quieres comparar: ");
scanf("%d", &n);
int B[n];
for (i=0;i(<)n;i++){
printf("número B[%d] = ", i);
scanf("%d", &B[j]);
}
for(i=0;i (<) n;i++){
cont=0;
for(j=0;j (<) N;j++){
if(B[j]==A[i]){
cont=cont+1;
}
}
printf("el numero %d se repitio %d veces", B[j], cont);
}
return 0;
system("pause");
}

Para compilarlo utilice ubuntu con los siguientes comandos:

gcc (nombredearchivo).c

que genera un archivo a.out y lo ejecutaremos de la siguiente forma:

./a.out

Saludos!!