Duda ejercicio con posibilidades infinitas

Iniciado por EstudXx, 7 Octubre 2012, 17:47 PM

0 Miembros y 1 Visitante están viendo este tema.

EstudXx

Hola, espero que me puedan ayudar con un problema de programación.

En el libro "Fundamentos de programación - Piensa en C", existe este problema:

Construye un programa en C que escriba todos los valores positivos de T, P y R que satisfagan la siguiente expresión:

(7*T^4) - (6*P^3) + 12*(R^5) < 5850

Nota: T, P y R solo pueden tomar valores positivos.


Ya he realizado el código, sin embargo, he notado que este no termina de arrojar valores que cumplen la expresión. Pienso que esto es debido a que teóricamente la cantidad de posibilidades es infinita debido a que un termino se encuentra restando.

Por lo tanto mi duda es: ¿Este problema de verdad tiene una cantidad infinita de posibles soluciones, o existe algo que no este tomando en cuenta y deba limitar la cantidad de estas?

Saludos y gracias por la ayuda.

BEATMASTER

#1
Me parece que debes primero "resolverlo" algebraicamente, osea buscar una solucion manual y reproducirla en C, lo que veo es una ecuacion con 3 variables entonces deberias buscar un metodo para resolver ecuaciones con 3 variables, probablemente te convenga hacerlo por "matrices" haciendo un metodo general para encontrar una solucion podrias encontrar N soluciones por medio de un ciclo.

Por ultimo, dudo que tenga infinitas soluciones ya que esta bien definido el "limite" de tu inecuacion osea que sea < (menor) que 5850 habra alguna combinacion de valores con los cuales ya no sea posible cumplir esta condicion.

Me parece el principal problema aqui es algebraico, sabiendo resolver adecuadamente tu ecuacion no debe ser muy dificil reproducir el "metodo" en tu programa

Podria ser algo asi... aunque este metodo solo sirve probando valor por valor de las combinaciones posibles, deberia haber algun metodo mas eficaz ademas de que solo prueba con los primeros 100 numero enteros de cada variable deberias variar el valor 99 por alguno diferente o variar un poco el codigo para que el programa lo haga automaticamente

for(int t=0;t<99;t++)
{
for(int p=0;p<99;p++)
{
for(int r=0;r<99;r++)
{
resultado=(7*pow(t,4))-(6*pow(p,3))+(12*pow(r,5));
if(resultado<5850)
{
printf("los valores cumplen la condicion %d , %d , %d \n",t,p,r);
}
}
}
}

EstudXx

El problema que veo es que yo puedo hacer esto:

Asignarle a  T: 1
Asignarle a  P: 1
Asignarle a  R: 1

Si sustituimos, veremos como estos 3 valores cumplen adecuadamente la condición, puesto que:

(7*1^4) - (6*1^3) + 12*(1^5) = 7 - 6 + 12 = 13  13 < 5850

Ok, después de esto, yo puedo incrementar a P por uno y dejar los otros 2 en 1.

Y como el termino donde esta P siempre resta, el resultado seria aun menor al anterior y seguiría cumpliendo.

Yo puedo repetir este proceso teóricamente en infinitas ocasiones, y esto ocasiona que las posibles respuestas sean infinitas.

¿Si me explico?



EstudXx

Por cierto, ya tengo un código que no se ve limitado en la cantidad de valores que prueba, usando while´s anidados.


int main()
{
unsigned int T=1,P=1,R=1;
while (7* pow (float(T),4) - 6* pow (float (P),3) + 12 * pow (float(R),5) < 5850)
{
while (7* pow (float(T),4) - 6* pow (float (P),3) + 12 * pow (float(R),5) < 5850)
{
while (7* pow (float(T),4) - 6* pow (float (P),3) + 12 * pow (float(R),5) < 5850)
{
printf ("%d, %d y %d cumplen \n",T,P,R);
R++;
}
R = 1;
P++;
}
P = 1;
T++;
}
return 0;
}


Y nunca termina de arrojar salidas validas.

BEATMASTER

algo anda mal con tus numeros :p

mira si sustituimos T=6 con P=1 y R=1 ya es una combinacion que excede el valor y por tanto es invalida

(7*6^4) - (6*1^3) + 12*(1^5) = 9072 - 6 + 12 = 9078  9078 > 5850

intenta primero con algo muy sencillo porque el meter la expresion al while podria ocacionar problemas, sobre todo me llama la atencion la parte donde haces R=1 y P=1 esa podria ser la causa de que se quede atrapado en el ciclo infinito ya que estas "reseteando las variables una y otra vez intenta poner un getch en cada resultado para que veas claramente los valores que arroja y no se esten repitiendo una y otra vez por eso recomendaba usar el for con valores fijos de momento, para tener mas control sobre la salida del programa ya despeus podemos pensar en optimizarlo :p saludos

EstudXx

Entiendo que existan combinaciones que excedan la expresión y sean invalidas.

Sin embargo, el código que te mostré no imprime valores inválidos ni repite combinaciones.

La reinicializacion en 1 existe para que todas las combinaciones posibles sean evaluadas.

Puesto que no es lo mismo probar

T=1 con P=1 y R=6

Con:

T=1 con P=2 y R=6 

O dicho de otra manera:

Lo que este código hace es probar 1,1,X, cuando X sea tan grande que la condicion no se cumpla, prueba con 1,2,X de nuevo hasta que no se cumpla. Sin esa reinicializacion estaria discriminando combinaciones.

Como sea, creo que no has analizado este argumento:

Cita de: EstudXx en  7 Octubre 2012, 20:05 PM
El problema que veo es que yo puedo hacer esto:

Asignarle a  T: 1
Asignarle a  P: 1
Asignarle a  R: 1

Si sustituimos, veremos como estos 3 valores cumplen adecuadamente la condición, puesto que:

(7*1^4) - (6*1^3) + 12*(1^5) = 7 - 6 + 12 = 13  13 < 5850

Ok, después de esto, yo puedo incrementar a P por uno y dejar los otros 2 en 1.

Y como el termino donde esta P siempre resta, el resultado seria aun menor al anterior y seguiría cumpliendo.

Yo puedo repetir este proceso teóricamente en infinitas ocasiones, y esto ocasiona que las posibles respuestas sean infinitas.

¿Si me explico?




Este es independiente de cualquier implementacion del problema en lenguaje computacional y permite analizar mejor la duda que tengo. Te pido que por favor le pongas especial atención a este argumento, ya que si no existe ningún error en el, entonces mi teoría de que las combinaciones son infinitas queda probada.

Lauta

Hola, si a T y a P le asignás, por ejemplo, el valor 1, cualquier valor que pongas en R te va a dar que la condición se cumple, por lo tanto, hay infinitos valores efectivamente.
TODOS LOS MANUALES DE PROGRAMACION!!!

Quieres ganar dinero? Clickea en alguno de los enlaces y empieza ya!!!
Daddybux
Bux.to
Adverbux
Dailyclick