Programa que sepa los signos que hay que poner en una igualdad

Iniciado por javirk, 31 Enero 2012, 21:26 PM

0 Miembros y 2 Visitantes están viendo este tema.

javirk

Hola, muchas gracias por vuestras respuestas, de verdad.

do-while, creo que tu solución se me queda algo grande, no sé ni por dónde empezar, pero muchas gracias, lo tendré que mirar más en detalle.

ghastlyX, aún no sé nada de vectores, pero parece que los entiendo más o menos al ver tu solución, muchas gracias.

Xandrete, creo que tu solución es la que más me interesa, posiblemente por ser la más corta, pero no me funciona cuando la compilo, es decir,  que no me sale nada, y meto 4 números y sale del programa; lo mismo me pasa con la de ghastlyX, pero este no sale, simplemente no hace nada. ¿Por qué puede ser eso?

Bueno, a lo que iba, Xandrete, lo que no entiendo del tuyo es eso del "comb[][2]", ¿por qué dos corchetes?

Un saludo y gracias a todos.

Xandrete

Cita de: javirk en  5 Febrero 2012, 16:46 PM
Hola, muchas gracias por vuestras respuestas, de verdad.

do-while, creo que tu solución se me queda algo grande, no sé ni por dónde empezar, pero muchas gracias, lo tendré que mirar más en detalle.

ghastlyX, aún no sé nada de vectores, pero parece que los entiendo más o menos al ver tu solución, muchas gracias.

Xandrete, creo que tu solución es la que más me interesa, posiblemente por ser la más corta, pero no me funciona cuando la compilo, es decir,  que no me sale nada, y meto 4 números y sale del programa; lo mismo me pasa con la de ghastlyX, pero este no sale, simplemente no hace nada. ¿Por qué puede ser eso?

Bueno, a lo que iba, Xandrete, lo que no entiendo del tuyo es eso del "comb[][2]", ¿por qué dos corchetes?

Un saludo y gracias a todos.

¿Quizás sea porque no existe ninguna combinación de operadores que haga que se cumpla la igualdad? No he tenido ningún problema con el código que te he propuesto. Yo lo he compilado con las opciones -Wall, -Werror y -Wextra para asegurarme de que no había ni error ni warnings de ninguna clase (siempre compilo así) y lo he probado con la entrada que das como ejemplo y con otras.

Con 7 2 1 8 la salida es:

7+2-1=8

Con 0 0 0 0 la salida es:

0-0-0=0
0+0-0=0
0-0+0=0
0+0+0=0

Con 1 1 1 1 la salida es

1+1-1=1
1-1+1=1

Y con 0 0 0 1 no se imprime nada (como ha de ser).

¿Por qué dos corchetes? Porque es un array de arrays de caracteres. O sea, una matriz o estructura de datos bidimensional. Se suelen declarar así, con un par de corchetes. Mírate bien el tema de los arrays.

Otra manera. Con if's, tal y como habías pensado tú al principio:

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main() {
int a,b,c,result;
cin >> a >> b >> c >> result;
if (a-b-c == result)
cout << a << "-" << b << "-" << c << "=" << result << endl;
if (a-b+c == result)
cout << a << "-" << b << "+" << c << "=" << result << endl;
if (a+b-c == result)
cout << a << "+" << b << "-" << c << "=" << result << endl;
if (a+b+c == result)
cout << a << "+" << b << "+" << c << "=" << result << endl;
}


Este último código si que es claro a más no poder. De todas formas, no nos has sacado de dudas aún acerca del número de signos que consideras. ¿Están la multiplicación y la división también incluidos? Todos estamos asumiendo que sólo te interesan sumas y restas.

Saludos




ghastlyX

Si no te hace nada mi programa y no termina es porque no le pasarás correctamente la entrada. Si te fijas en lo que he dicho o en el código, verás que mi programa no trabaja con tres números, sino con los que tú quieras, lo he hecho para el caso general . El formato de la entrada es primero la cantidad de números que usarás (en tu caso sería 3), a continuación el resultado que buscas y luego los números que se deban usar (tantos como hayas indicado). Por ejemplo, para tu ejemplo sería:
3 8                                                                                                                                           
7 2 1


Y la salida que produce es
+7+2-1

Otro caso por ejemplo sería
5 8
7 2 1 1 1


Y su salida es
+7+2+1-1-1
+7+2-1+1-1
+7+2-1-1+1

do-while

#13
¡Buenas!

No se si el problema esta bien planteado. ¿Los numero hay que utilizarlos en el orden en el que se introducen, o se pueden reordenar?

Lo digo porque si se pueden reordenar, en principipo tendras 4 formas de poner los simbolos de suma y resta en los dos huecos que tienes, y 6 (3!) formas de reorganizar los tres numeros para buscar el resultado, en total 24 casos (que luego se quedan en menos, ya que la suma es conmutativa). Si estas en este ultimo caso, introducir todas las condiciones a mano es largo y bastante propenso a cometer errores...

¡Saludos!

Editado:

Si lo miras con mas detenimiento, solo tienes que variar los coeficientes de los elementos. +/-a, +/-b y +/-c y luego sumarlos, asi queda mas claro, ya que solo tendras que comprobar 8 casos y te olvidas de reordenar los elementos:

a+b+c
a+b-c
a-b+c
-a+b+c
a-b-c
-a+b-c
-a-b+c
-a-b-c
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xandrete

¿Reordenar? Bueno, javirk no nos había planteado esa posibilidad.

Si fuera posible, lo que haría simplemente sería considerar un signo más (un - o + antes de la a) y me ahorraría reordenar, que es justo lo que propone do-while. En ese caso habría 23= 8 casos, tal y como nos sugiere. De todas formas, yo apuesto por la Navaja de Ockham y creo que el problema es la versión más sencilla de la que hemos planteado por aquí: sólo dos operadores (suma y resta) y sin posibilidad de reordenación. Y si no es así, que javirk nos dé el enunciado completo de su problema. No tiene sentido que especulemos mientras él no nos dice ni mu xD (javirk, no te mosquees, lo digo sin intención de ofender, a lo mejor no has podido responder aún por alguna razón >.<)

¡Saludos!

javirk

No he podido jaja estaba en el colegio. El problema no tiene enunciado, me lo he planteado a mí mismo y no se me ocurría forma de hacerlo y por eso pregunté, gracias a todos, de verdad. Lo de la reordenación, pues yo creo que sería como dice Xandrete, en vez de poner al primero el signo positivo, que pueda cambiar entre positivo y negativo.

Y en cuanto a la multiplicación y la división... mejor las dejo de lado, que ahí habría que tener en cuenta demasiadas cosas y no creo que supiera...

javirk

#16
Hola, he estado pensando todos estos días para hacer lo de poner delante del primer número un + o - y así evitar lo del orden, se necesitaría hacer una matriz tridimensional, ¿no?

Otra cosa, Xandrete, no entiendo en tu código por qué cuando comb[i][0]=='-' entonces res=a-b.

Muchas gracias.


Xandrete

A ver. Respondiendo a tu primera pregunta. No, seguiría siendo bidimensional. Sería una matriz 8x3, porque habría 8 casos en total (23) y 3 operadores a decidir.

En el código que te puse (antes del de los if's) la matriz comb es 4x2 porque hay 4 casos en total (22)) y 2 operadores a decidir. El nombre, de hecho, se lo puse por la palabra combinaciones. El sentido de esa matriz es guardar todos los casos posibles: que el primer signo sea - y el segundo -, el primero - y el segundo +, etc.

En cualquier caso, esta solución de la matriz sólo tiene gracia cuando hay poquitos casos. Con 8 casos se me antojaría ya una forma poco elegante y me pasaría a la solución con bucles anidados que te han dado ya con anterioridad.

Tu segunda pregunta. El elemento comb[ i ][0] representa al primer operador de la i-ésima combinación, y comb[ i ][1] al segundo. Si comb[ i ][0] = '-' entonces en res guardamos a - b, y si no, a + b. Luego, a res le sumamos o le restamos c en función de comb[ i ][1]. Comparamos res con result y si son iguales, imprimimos la combinación.

Saludos

do-while

¡Buenas!

No te hace falta una matriz. Con tres bucles tienes de sobra:



for(i = 0 ; i < 2 ; i++)
{
    for(j = 0 ; j < 2 ; j++)
    {
        for(k = 0 ; k < 2 ; k++)
        {
            (1 - (i * 2)) * a + (1 - (j * 2)) * b + (1 - (k * 2)) * c
            // ...
        }
    }
}



¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!