Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SebaC en 8 Mayo 2016, 20:37 pm



Título: Sumar y multiplicar una serie de números
Publicado por: SebaC en 8 Mayo 2016, 20:37 pm
Debo realizar el siguiente programa que reciba como entrada una serie de 1 y 0 este debe sumar los grupos de 1 y luego multiplicar cada uno

Por ejemplo: 011110011100011
Salida: 4*3*2= 24

Hasta ahora llevo esto

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int num, cant=0;
  8.    int resto;
  9.  
  10. do{
  11.     num=num/10;
  12.    resto=num%10;
  13.  
  14.    if(resto==1)
  15.       cant++;
  16. } while(num)
  17.  
  18.   return 0;
  19. }
  20.  
El problema es que no se como multiplicarlos


Título: Re: Sumar y multiplicar una serie de números
Publicado por: class_OpenGL en 8 Mayo 2016, 20:47 pm
Te pide que introduzcas una serie de 1s y 0s, pero tu introduces un entero. ¿Cuál es la diferencia? Que si tienes un 0 a la izquierda no lo vas a leer. Así que lo que tienes que hacer es leer una cadena de caracteres e iterar por toda ella verificando que posiciones son '1' y qué posiciones son '0'. Ahora solo queda aplicar las reglas propuestas


Título: Re: Sumar y multiplicar una serie de números
Publicado por: AlbertoBSD en 8 Mayo 2016, 20:58 pm
Es cierto lo que te dicen, tienes que manejar cadenas en lugar de enteros, por lo menos con la entrada que muestras el 0 a la izquierda se perderia con un entero.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. char *numero = "011110011100011";
  6. int len = strlen(numero);
  7. int i = 0;
  8. int n,m = 1,entrar = 0;
  9. while(i < len) {
  10. n = 0;
  11. printf("Evaluando %c\n",numero[i]);
  12. while(numero[i] == '1' && i < len) {
  13. printf(".\n");
  14. n++;
  15. i++;
  16. entrar =1;
  17. }
  18. if( entrar ) {
  19. m = m * n;
  20. i--;
  21. entrar =0;
  22. }
  23. i++;
  24. }
  25. printf("%i",m);
  26. }


Título: Re: Sumar y multiplicar una serie de números
Publicado por: geeke en 9 Mayo 2016, 02:33 am
Otro enfoque en C++
Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.    int c, m = 1, v = 0;
  6.  
  7.    for(; (c = std::cin.get()) != '\n'; v += c & 1)
  8.        if( v && c == '0' && std::cin.peek() == '1' )
  9.        {
  10.            m *= v;
  11.            std::cout << v << '*';
  12.            v = 0;
  13.        }
  14.    std::cout << v << " = " << (m *= v);
  15. }
  16.  


Título: Re: Sumar y multiplicar una serie de números
Publicado por: SebaC en 9 Mayo 2016, 18:22 pm
Hola gracias a todos tengo una pregunta en el código de Geeke veo esta asignación v += c & 1 puedes explicarme que hace


Título: Re: Sumar y multiplicar una serie de números
Publicado por: MAFUS en 9 Mayo 2016, 19:01 pm
En C, facilito y para toda la família  :rolleyes:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char str[255];
  5.    scanf("%255s", str);
  6.    int n = 0;
  7.    int res = 1;
  8.    int i;
  9.  
  10.    for(i = 0; i < sizeof(str); ++i) {
  11.        if(str[i] == '1')
  12.            ++n;
  13.        else {
  14.            if(n)
  15.                res *= n;
  16.            n = 0;
  17.        }
  18.    }
  19.    printf("%i\n", res);
  20.  
  21.    return 0;
  22. }
  23.  


Título: Re: Sumar y multiplicar una serie de números
Publicado por: geeke en 9 Mayo 2016, 20:26 pm
Los caracteres '0' y '1' son equivalente a:

48 en base 2: 110001
49 en base 2: 110000

El primero tiene el bit 1 a cero, el segundo no al realizar c & 1 la expresión resulta en 1 si el carácter es '1' y 0 si el carácter es '0'.

Y de paso otra aproximación en C  :rolleyes:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.    int m = 1, n;
  6.    while (1)
  7.    {
  8.        scanf("%*[0]");
  9.        scanf("%*[1]%n", &n);
  10.        if (n > 0)
  11.        {
  12.            m *= n;
  13.            n = 0;
  14.        }
  15.        else
  16.            break;
  17.    }
  18.    printf("%d\n", m);
  19.    return 0;
  20. }