ver el mediano de 3 numeros

Riu

Bueno esto no tiene que ver nada con programacion es para otra cosa, pero nunca me ha salido este ejercicio de ver el mediano de 3 numeros me gustaria que me contarais como hacerlo, por que por mas que lo pienso, me lio y nunca lo termino ;s

bLaKnI

a) Los pones en una lista, haces un sort y el del medio es tu numero.
b) Coges un numero, lo comparas con el siguiente. Si es mas pequeño, lo comparas con el siguiente y si es mas grande, es el mediano. Sino, tenias el mas pequeño. Luego lo descartas y te quedas el mas pequeño de los 2 que quedan.

Riu

#2 necesito hacerlo con la opcion b puedes ponerlo con un ejemplo es que asi no lo veo claro por muxo ke lo mire si no veo un ejemplo no me keda claro, ;)

dagavi

Hombre, si te refieres a sacar el número B tal que:

A <= B <= C

Pues no tiene ninguna complicación, lo puedes hacer de varias formas, algunas completamente triviales. Al ser 3 números puedes hacerlo por comparaciones directas y comprobando caso por caso:

si b <= a <= c retorna a
si a <= b <= c retorna b
...

O si no también podrías tener en cuenta que agrupas de 2 en 2 y sacas los máximos, el mínimo de eso será el valor medio.

medio = min(max(a,b), max(b,c), max(a,c))

min(a,b,c) = min(min(a,b), c)

Riu

#3 no, quiero hacerlo , ver el mediano de los 3, todos los casos posibles.
si a>b entonces comparo si b>c si lo es , el valor medio es b.
sino comparo si c>a si lo es a es el valor medio es a, sino c es el valor medio, y asi sucesivamente..

Gnos1s

Otra forma:

  • Pides los 3 números
  • Tomas como mediano el primero (por ejemplo): mediano = a

Comparas con el resto:

  • if(mediano>b) mediano = b
  • if(mediano>c) mediano = c
  • return mediano

Editado: cierto, puse el mínimo de los 3 :P. Sorry.

grivcon

#6 supongo que que esos if estan anidados

bLaKnI

Gnosis, en este de aqui:

  • if(mediano>c) mediano = c

debe ser:

  • if(mediano<c) mediano = c

para que funcione lo que has dicho.

A>B --> B
B>C --> C --> MAL!

"A>B>C"

A>B --> B
B<C --> C OK!

"A>C>B"

Pero sea como sea, está mal, ya que te queda comprobar si C>A, ya que entonces el mediano seria A, el inicial.
Ni que los IFs esten anidados tampoco esta bien. Ya que en caso de que A>B, nada te garantiza que no sea tambien A>C.

Riu

#8 esto me esta rayando una barbaridad joder..

dagavi

Lo único que le está diciendo, pero en un tocho post xD es que lo que el ha escrito no es un algoritmo para obtner el medio de 3 número, si no el mínimo de 3 número:

Algo obvio de ver si coges el primero como "minimo" (aunk el le ha llamado medio) y después substituyes el mínimo si encuentras otro menor:

minimo = a;
if (minimo > b) minimo = b;
if (minimo > c) minimo = c;

ZeNiT2

si tienes problema con esto retirate de la programacion

LOc0

Creo que si calculas las media de los 3, el que más se aproxime a ese número es el del medio.

Salu2 ;)

NeO_PedritO

#11 + 1

Si tienes problemas para ver las cosas haz varios ejemplos, asi seguro que te entra en la cabeza.

NeB1

tenemos A, B y C.

if(A>B){
__if(A<C){
_____mediano=A;
__}
__else{
_____if(C>B){
_______mediano=C;
_____}
_____else{
_______mediano=B;
_____}
__}
}

if(A>C)
{

a partir de aquí piensalo tú que es un tocho...
}

la otra forma es hacer esto:

media=(a+b+c)/3;

mediano=ABS(min((media-a),(media-b),(media-c)))+media;

que quiere decir, que el que más cerca está de la media de los 3 números, es el del medio, sacas la media de los números; y después a cada número le restas la media, y el resultado menor es el del número del medio (pero como le había restado la media, pos se la vuelvo a sumar)

Soltrac

El método de los IFs es el peor q puedes sacar, porque tarda del orden del sumatorio de (n-1).

bLaKnI

Bah, dejaros de cosas raras...

Esto es sin duda lo mejor! xDD

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


double getMediano(double A, double B, double C){
	vector<double> nums;
	nums.push_back(A);
	nums.push_back(B);
	nums.push_back(C);

sort(nums.begin(), nums.end());

return nums[1];
}

void main(){
	double A = 12, B = 34, C = 7;

cout << "Numero del medio: " << getMediano(A,B,C) << endl;
}

Ale! xD

Gnos1s

¿El mejor en cuanto a memoria usada dices? ... Usar un TDA para eso... madre mía.

JuAn4k4

Yo diria que es algo asi :

¿ Cual es el mediano de 1 1 2 ?

1 ? o 2 ?

double getMediano(double a,double b,double c) {

if ( a > b ) { 
  if ( a > c ) {// a es el mayor
                   return max(b,c); } 
  else  { // c es el mayor , o igual a a.
            /* De ser respuesta 1, 
            if ( c != a ) {return max(a,b) } else { return c; }
           */
            return max(a,b) }
 }
else {
  if ( b > c ) {// b es el mayor
                   return max(a,c); } 
  else  { // c es el mayor o igual a b
            /* De ser respuesta 1, 
            if ( c != a ) {return max(a,b) } else { return c; }
            */
            return max(b,a) }
 }
}

double max (double  a, double b) {
if ( a > b) return a; else return b; 
}
dagavi

En 1 línea:

int medio(int x, int y, int z) {
    return min(min(max(x, y), max(y, z)), max(x, z));
}

Ejecutado:
medio(1,2,3) = 2
medio(1,3,2) = 2
medio(2,1,3) = 2
medio(2,3,1) = 2
medio(3,1,2) = 2
medio(3,2,1) = 2
medio(1,1,2) = 1 // Aunk sería correcto si mostrara 2 ya que no hay medio

PD: min(min(x, y), z) = min(x, y, z)

Soltrac

La manera más eficiente es ordenar el array (por supuesto con un buen algoritmo) y sacar la posición media...las demás todas son más lentas (siempre que hablemos de sacar el mediano de N números, suponiendo N muy grande, con 3 no se nota diferencia xd).

MaKi

Esto es la mediana, que no es lo mismo que la media, el algoritmo es el mismo para 3 que para N:

spoiler
MaKi

lo que hace el #16 es lo más correcto por ahora que haya visto en este post. Si no te dejan usar std sigue siendo igual de válido, pero implementate tu un el algoritmo de ordenación.

Usuarios habituales

  • MaKi
  • Soltrac
  • dagavi
  • Gnos1s
  • bLaKnI
  • NeO_PedritO
  • Riu