Reto Universidad [C++].

Iniciado por bigfu, 20 Julio 2011, 13:04 PM

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

bigfu

El ejercicio 7 es un juego, en el que juegan el humano contra el ordenador. El ordenador decide quien empieza y tienen que ir restando 1, 2 o 3 en turnos alternos hasta que ya no haya más objetos que coger. El que coge el último objeto, pierde.
Pues bien, con esas condiciones, tienes que desarrollar un algoritmo en el que SIEMPRE gane la máquina.
A reader lives a thousand lives before he dies. The man who never reads lives only one

bigfu

Ya está añadido el contenido del tema 2 y los ejercicios correspondientes. Mirar primer post.
A reader lives a thousand lives before he dies. The man who never reads lives only one

.mokk.

#22
Código (c++) [Seleccionar]

#include <iostream>

using namespace std;

static bool EsPar(int n)
{
       return ((n % 2) == 0);
}

int main (int argc, char *argv[])
{
    int tam;
    do{
        cout << "Ingrese el tamaño del triangulo [IMPAR]" << endl;
        cin >> tam;
    }while(EsPar(tam) || tam < 2);
    for(int i = 0; i <= tam/2; i++)
    {
            for (int j=1; j <= tam/2-i; j++)
            {
                cout<<" ";
            }
            for (int j=1; j <= i*2+1; j++)
            {
                cout<<"*";
            }
            for (int j=1; j <= tam/2-i; j++)
            {
                cout<<" ";
            }
            cout << endl;
    }
    cin.get();cin.get();
    return 0;
}


El segundo no lo entiendo:
CitarN=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1.
Porque el resultado seria 6 si "i" se encuentra en la posicion 0 ? o como?

bigfu

#23
Cita de: .mokk. en 28 Julio 2011, 00:54 AM
El segundo no lo entiendo:Porque el resultado seria 6 si "i" se encuentra en la posicion 0 ? o como?

El ejercicio pide que introduzcamos un numero (N) y una posición (i). Por tanto, fijándonos en el ejemplo, vemos que N=25064 e i=2, por lo que el resultado es 6. i es la posición en el número, empezando desde la derecha (i=1->resultado=4; i=3->resultado = 0). No sé si me he explicado bien...

Por cierto, le acabo de echar un vistazo a tu código del triángulo. Aunque en el ejercicio ponga de ejemplo N=5, el código debe realizarse para cualquier número, par o impar. Es que he visto que solo lo construye para los número impares  ;)
Y otra cosa, la altura es igual a N. Según tu código, la altura es N/2.

Gracias por intentarlo y postearlo, te animo a que le eches otro vistazo al código anterior y te animes con el ejercicio 2  :D
A reader lives a thousand lives before he dies. The man who never reads lives only one

ghastlyX

Algunos de los ejercicios del tema 2 te han quedado muy largos y poco simples, suponiendo que sean correctos, puesto que no los he mirado todos. Te pongo soluciones alternativas más cortas y simples, por lo menos a mi parecer.

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

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cout << string(n - i, ' ');
        for (int j = 0; j + 1 < i; ++j) cout << "* ";
        cout << "*" << endl;
    }
}

//Problema 2
#include <iostream>
using namespace std;

void imprime(int n, int i) {
    if (i == 1) cout << n%10 << endl;
    else if (n/10 == 0) cout << -1 << endl;
    else imprime(n/10, i - 1);
}

int main() {
    int n, i;
    cin >> n >> i;
    imprime(n, i);
}

//Problema 3
#include <iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    for (int i = 0; i < s.size() >> 1; ++i) {
        if (i > 0) cout << ", ";
        cout << s[i] << " + " << s[s.size() - 1 - i] << " = " << s[i] - '0' + s[s.size() - 1 - i] - '0';
    }
    if (s.size()&1) cout << ((s.size() > 1)?", ":"") << s[s.size()>>1];
    cout << endl;
}


//Problema 4
#include <iostream>
using namespace std;

int main() {
    int maxim = 0, act = 0;
    char c, ant = '0';
    while (cin >> c) {
        if (c >= ant) ++act;
        else {
            maxim = max(maxim, act);
            act = 1;
        }
        ant = c;
    }
    maxim = max(maxim, act);
    cout << maxim << endl;
}


//Problema 6
#include <iostream>
using namespace std;

int mcd(int a, int b) {
    if (a == b) return a;
    return (a > b) ? mcd(a - b, b) : mcd(b - a, a);
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << mcd(a, b) << endl;
}

bigfu

Cita de: ghastlyX en 28 Julio 2011, 22:38 PM
Algunos de los ejercicios del tema 2 te han quedado muy largos y poco simples, suponiendo que sean correctos, puesto que no los he mirado todos. Te pongo soluciones alternativas más cortas y simples, por lo menos a mi parecer.

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

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cout << string(n - i, ' ');
        for (int j = 0; j + 1 < i; ++j) cout << "* ";
        cout << "*" << endl;
    }
}

//Problema 2
#include <iostream>
using namespace std;

void imprime(int n, int i) {
    if (i == 1) cout << n%10 << endl;
    else if (n/10 == 0) cout << -1 << endl;
    else imprime(n/10, i - 1);
}

int main() {
    int n, i;
    cin >> n >> i;
    imprime(n, i);
}

//Problema 3
#include <iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    for (int i = 0; i < s.size() >> 1; ++i) {
        if (i > 0) cout << ", ";
        cout << s[i] << " + " << s[s.size() - 1 - i] << " = " << s[i] - '0' + s[s.size() - 1 - i] - '0';
    }
    if (s.size()&1) cout << ((s.size() > 1)?", ":"") << s[s.size()>>1];
    cout << endl;
}


//Problema 4
#include <iostream>
using namespace std;

int main() {
    int maxim = 0, act = 0;
    char c, ant = '0';
    while (cin >> c) {
        if (c >= ant) ++act;
        else {
            maxim = max(maxim, act);
            act = 1;
        }
        ant = c;
    }
    maxim = max(maxim, act);
    cout << maxim << endl;
}


//Problema 6
#include <iostream>
using namespace std;

int mcd(int a, int b) {
    if (a == b) return a;
    return (a > b) ? mcd(a - b, b) : mcd(b - a, a);
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << mcd(a, b) << endl;
}


Muchas gracias por las sugerencias, pero el problema es que estoy haciendo los ejercicios acorde a lo que llevo visto hasta ahora, por lo que, por ejemplo, aún no podría utilizar variables de tipo string. Pero me vienen muy bien tus soluciones para volver a comparar los ejercicios cuando haya dado todo el temario.
Reconozco que mi principal fallo es no saber hacer los algoritmos más cortos y eficientes, pero estoy trabajando en ello (aunque de todas formas solo me piden que funcionen, pero me convendría aprender a simplificar).

gracias!
A reader lives a thousand lives before he dies. The man who never reads lives only one

bigfu

Compis, me he atascado con el ejercicio que me falta, no consigo verlo sin utilizar arrays. Me dais una pista (no me pongáis el código, por favor) para ver si lo puedo sacar?? Lo único que se me ocurre es un código larguísimo y que no tengo claro que funcione bien y no sé muy bien por donde meterle mano...

CitarEjercicio 5: Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 >...an.
Definimos la longitud de una montaña como el número de enteros que la forman. Por ejemplo la sucesión -7,-1,6,21,15 es una montaña de longitud 5.

Definimos un valle de la misma forma que una montaña pero cambiando el signo de las desigualdades de la definición anterior: a1>...ah-1 > ah < ah+1 <...an. Por ejemplo, 24, 13, 6, 15, 50 sería un valle.

Dada una secuencia de enteros terminada en cero que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos.
A reader lives a thousand lives before he dies. The man who never reads lives only one

bigfu

Al final lo conseguí hacer, me ha costado un poco pero lo he conseguido. Ahora, no me gusta la forma en que lo he resuelto. Me ha salido un código bastante lioso, pero es que no me salía otra forma de hacerlo.

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

void paisaje(int num, int& ant, unsigned& a, unsigned&b, bool& subida, bool& p_bajo);

int main() {
int num, ant=0;
bool subida_m = false, p_bajo = false;
unsigned m = 0, v = 0;
unsigned a = 0, b = 0;

cout << "Introduzca secuencia de enteros: ";
do{
cin >> num;
paisaje(num,ant,a,b,subida_m,p_bajo);
if(a>m){
m = a;
}
if(b>v){
v = b;
}
}while(num!=0);

cout << "La montaña mas larga: " << m << endl;
cout << "El valle mas largo: " << v << endl;

return 0;
}

void paisaje(int num, int& ant, unsigned& a, unsigned& b, bool& subida, bool& p_bajo){
if(ant==0){
ant = num;
a++;
b++;
}else if((num<ant)&&(num!=0)&&(!p_bajo)){
ant = num;
a++;
b++;
}else if((num<ant)&&(num!=0)&&(p_bajo)){
p_bajo = false;
b = 2;
a++;
ant = num;
}else if((num>ant)&&(!subida)&&(num!=0)&&(!p_bajo)){
a = 2;
b++;
ant = num;
subida = true;
p_bajo = true;
}else if((num>ant)&&(subida)&&(num!=0)&&(p_bajo)){
a++;
b++;
ant = num;
}
}


Si pudiérais darme alguna pista o consejo para intentar simplificarlo un poco, os lo agradecería  :D
A reader lives a thousand lives before he dies. The man who never reads lives only one

bigfu

Primer post actualizado con los ejercicios del tema 3 (último tema de la asignatura). Estar tarde pondré las soluciones de los 4 o 5 primeros ejercicios, que ya los tengo.

Saludos!
A reader lives a thousand lives before he dies. The man who never reads lives only one

PiroskY

No podes usar memoria dinámica para ese ultimo?

Me parece que seria mucho mas fácil y limpio si podes buscar las cosas una vez que tenes todos los números.