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
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.
#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,
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)
#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..
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 . Sorry.
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.
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;
#11 + 1
Si tienes problemas para ver las cosas haz varios ejemplos, asi seguro que te entra en la cabeza.
tenemos A, B y C.
if(A>{
__if(A<C){
_____mediano=A;
__}
__else{
_____if(C>{
_______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)
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
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;
}
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)
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).
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.