[Ayuda]Secuencias

Iniciado por Sothu, 14 Noviembre 2015, 20:23 PM

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

Sothu

Buenas a todos!
Mi problema es el siguiente: tengo que hacer un programa en c++ usando una secuencia, acabando tal cuando se introduzca el EOS = -1, y al acabar debe decirme si hay alguna pareja consecutiva en que las sumas de la cifras sean iguales. Ej: 45 54 (ambos suman 9). El problema en que me encuentro es que no se como comparar los distintos numeros que se van introduciendo en la secuencia ya que todos entran por el mismo cin dentro de un while.
Les dejo lo que tengo de momento (esta en catalan pero creo que es entendible).
Gracias de antemano :)
#include <iostream>

using namespace std;

const int EOS = -1;

int sumaXifres(int n)
{
   int suma=0;
   while (n!=0)
   {
         suma+=n%10;
         n=n/10;
   }
   return suma;
}

int main()
{
   int numero, numero1, n;
   cout << "DADES:" << endl;
   cin >> numero;
   while (numero != EOS)
   {
       cin >> numero;
       sumaXifres(numero) = n;
   }
   if ((sumaXifres(numero)) == (sumaXifres(numero1)))
   {
       cout << "LA SEQUENCIA CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES:" << numero << "," << numero1;;
   }
   else cout << "LA SEQUENCIA NO CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES.";
   return 0;
}

Zodiak98

No me quedó del todo claro lo que intentas hacer, pero acá varias cosillas:

Código (cpp) [Seleccionar]

cout << "DADES:" << endl;
    cin >> numero; // <- Acá
    while (numero != EOS)
    {
        cin >> numero; // <- Estás pidiendo el mismo valor 2 veces.
        sumaXifres(numero) = n;
    }


También estás declarado numero y número1, y "numero1" nunca la utilizas, así que:
Código (cpp) [Seleccionar]

if ((sumaXifres(numero)) == (sumaXifres(numero1))) // <- Este if jamás se cumplirá.
    {
        cout << "LA SEQUENCIA CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES:" << numero << "," << numero1;;
    }


Y no es válido hacer esto:

Código (cpp) [Seleccionar]

sumaXifres(numero) = n; /*A menos que la función retorne una referencia, y a esta se le asigna el valor de la variable 'n'*/


En fin, si lo que quieres es ir guardando valores de manera indefinida e ir registrando al mismo tiempo la suma de sus números que componen a ese entero puedes usar vectores.

Código (cpp) [Seleccionar]

int main() {
   
    int valor;
    vector<int> enteros, sumas;
   
    cin >> valor;
   
    while(valor != EOS) {
        enteros.push_back(valor);
        sumas.push_back(sumaXifres(valor));
        cin >> valor;
    }
   
    return EXIT_SUCCESS;
}


Y luego recorrerás cada valor del vector hasta encontrar otro valor que coincida con la suma. Y lógicamente el valor de la suma tendrá el mismo índice que el del número entero en sí. Por lo que vas comparando el primer valor con el resto, y así sucesivamente con todos hasta dar con otro igual y luego muestras los 2.

racso97

#2
Buenas! :D
Creo Zodiak98 que no quedó claro lo que había que hacer, yo tengo el mismo problema que Sothu, me quedé estancado con este programa. Se tiene que realizar un programa que dada una secuència de entrada de naturales, diga si hay 2 números consecutivos y la suma de sus dígitos coincidan(ej:32[3+2=5] y 23[2+3=5]). Después de poner la última dada válida acabar cuando se introduzca EOS= -1. Espero que haya quedado más claro ahora y pueden ayudarnos.
Gracias :P




Código:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

const int EOS = -1;

int sumaXifres(int n)
{
   int suma=0;
   while (n!=0)
   {
         suma+=n%10;
         n=n/10;
   }
   return suma;
}

int main()
{
   int numero, numero1, n;
   cout << "DADES:" << endl;
   cin >> numero;
   while (numero != EOS)
   {
       sumaXifres(numero) == n;
   }
   if ((sumaXifres(numero)) == (sumaXifres(numero1)))
   {
       cout << "LA SEQUENCIA CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES:" << numero << "," << numero1;;
   }
   else cout << "LA SEQUENCIA NO CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES.";
   return 0;
}


[MOD] Para publicar código usar etiquetas GeSHi.

Zodiak98

#3
Pero entonces necesitan pedir numero1 también, y sólo piden numero. Lo correcto sería que dentro del while ocupes 2 "cin", uno para numero, y otro para numero1, y luego comparar. Y si alguno de los 2 es -1 entonces finalizas.

Pensé que se referían a que se iba a introducir una cantidad ilimitada de números, y luego comparar cada uno de ellos a ver si alguno coincidía. Pero si sólo irán de 2 en 2, entonces pide 2 números en el while y luego comparas.

racso97

Un ejemplo que tendria que hacer el programa seria este:

Dades:
1
2
23
44
33
32
23
44
55
-1
La secuencia contiene una pareja consecutiva con igual suma de digitos

Con que detecte una pareja que salte ese mensaje y tu introduces los numeros que quieras.
Te lo digo para acabar de concretar el problema  :P

Zodiak98

#5
Bueno entonces usas vectores.
Mira acá te lo dejo:
Código (cpp) [Seleccionar]

#include <iostream>
#include <vector>

using namespace std;

const int EOS = -1;

int sumaXifres(int n);

int main() {
   vector<int> numeros, suma_numeros;

   int numero;
   cin >> numero;

   bool encontrados = false;

   while(numero != EOS) {
       numeros.push_back(numero);
       suma_numeros.push_back(sumaXifres(numero));
       cin >> numero;
   }

   int tamanio = numeros.size();

   for(int j = 0; j < tamanio - 1; ++j) {
       for(int i = j + 1; i < tamanio; ++i) {
           if(suma_numeros[j] == suma_numeros[i]) {
               cout << "Pareja encontrada: "
               << numeros[j] << " , " << numeros[i] << endl;
               encontrados = true; //Al menos 1 pareja fue encontrada.
           }
       }
   }

   if(!encontrados)
       cout << "No se han encontrado parejas..." << endl;


   return 0;
}

int sumaXifres(int n) {
   int suma=0;

   while (n!=0) {
         suma += n % 10;
         n = n / 10;
   }

   return suma;
}


EDIT:
Ahora, por ejemplo, si introduces 2 números iguales:
45
65
76
65
-1

Te arrojará que 65 y 65 son pareja. Para evitar eso puedes agregar al if una condición que diga que si esos números son iguales, entonces no entre al if, y la condición quedaría así:
Código (cpp) [Seleccionar]

if(suma_numeros[j] == suma_numeros[i] && numeros[j] != numeros[i]) {
      cout << "Pareja encontrada: "
      << numeros[j] << " , " << numeros[i] << endl;
      encontrados = true; //Al menos 1 pareja fue encontrada.
}


Pero si no quieres eso entonces lo dejas como estaba al principio.

racso97

Gracias Zodiak98 por tu tiempo pero me sigue dando error. Está vez funciona el programa pero tiene que saltar el mensaje de contiene una pareja consecutiva... cuando detecte una pareja consecutiva.
ej:
1
2
23
32
44
-1
En este ejemplo son consecutivos.
ej 2:
1
2
23
33
32
44
-1
En este otro, en cambio, hay pareja pero no son consecutivos y por tanto debería poner que no contiene ninguna pareja consecutiva.

Espero haberme explicado bien y espero que me echen una mano.
Gracias amigos  :D

Zodiak98

#7
Ah pues entonces hay que hacer sólo un cambio pequeñito. Pensé que simplemente había que buscar parejas (independientemente si estaban consecutivas o no), pero bueno nada del otro mundo, reemplazamos esto:

Código (cpp) [Seleccionar]

for(int j = 0; j < tamanio - 1; ++j) {
       for(int i = j + 1; i < tamanio; ++i) {
           if(suma_numeros[j] == suma_numeros[i]) {
               cout << "Pareja encontrada: "
               << numeros[j] << " , " << numeros[i] << endl;
               encontrados = true; //Al menos 1 pareja fue encontrada.
           }
       }
   }


Por esto:
Código (cpp) [Seleccionar]

for(int j = 0; j < tamanio - 1; ++j) {
       if(suma_numeros[j] == suma_numeros[j + 1]) {
           cout << "Pareja encontrada "
           << numeros[j] << " , " << numeros[j + 1] << endl;
           encontrados = true; // Al menos una pareja encontrada.
       }
}


Con eso ya sólo tomará en cuenta si son consecutivos. :)