Dev - C++ - problema para entender ejercicio

   
Vista:

problema para entender ejercicio

Publicado por omar omarelalamiarrais@gmail.com (2 intervenciones) el 06/08/2014 17:06:07
Alguno me puede explicar este ejercicio no lo entiendoo solo entendi la mitad y aunque lo intente yo no consegui sacarlo algun consejo porfavorrr
Escribir un programa que pida varios números, hasta que el usuario quiera terminar, y los descomponga en factores primos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/ Programa que descompone números en factores primos
// 26/07/2003 Salvador Pozo
 
#include <iostream> // biblioteca para uso de cout 
using namespace std;
 
int main()
{
   int numero;
   int factor;
   char resp[12];
 
   do {
      cout << "Introduce un número entero: ";
      cin >> numero;
      factor = 2;
      while(numero >= factor*factor) {
         if(!(numero % factor)) {
            cout << factor << " * ";
            numero = numero / factor;
            continue;
         }
         if(factor == 2) factor++;
         else factor += 2;
      }
      cout << numero << endl;
      cout << "Descomponer otro número?: ";
      cin >> resp;
   } while(resp[0] == 's' || resp[0] == 'S');
   return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

problema para entender ejercicio

Publicado por vangodp (287 intervenciones) el 06/08/2014 18:40:52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream> // biblioteca para uso de cout
using namespace std;
 
int main() {
    int numero;
    int factor;
    char resp[12];
 
    //do while garantiza que al menos una vez entres en el bucle. Las siguientes veces va depender de las expresiones ;)
    do {
        cout << "Introduce un número entero: ";
        cin >> numero;
        factor = 2;
 
        //mientras que numero no sea mayor que 2*2
        while ( numero >= factor * factor ) {
            //si introduces un numero par en la variable numero va arrojar un cero que es lo que...
            //...sobra de dividir un numero par(numero) por 2(factor) y ahora es donde entra el ...
            //..símbolo ! que hace que el cero valga 1 y el uno valga cero (negar)
            //Entonces si a numero le asigno un 10 y le divido por 2 sobrará cero y eso es falso en c++...
            //..cosa que no le interesa al que hizo el code, si el resultado de numero % factor es ..
            //...cero el símbolo ! hace que valga uno y si el resultado es 1 hace que valga 0
            //Si introduces un numero par a la variable numero entras al if, caso contrario pasas directo sin entrar aqui ;)
            if ( ! ( numero % factor ) ) {
                cout << factor << " * ";
                numero = numero / factor;
 
                //Al contrario de break que termina el bucle inmediatamente saltando las siguientes sentencias continue hace que volvamos al
                //inicio de while ( numero >= factor * factor )...o sea que no pasaras por las 
                //sentencias siguientes hasta que la condición de este if sea 1 que es la de dividir un numero impar por 2 y sobra 1. al usar el símbolo ! arroja 0 y hace que salte a los siguientes ifs
                continue;
            }
 
            //si no se entra al if anterior se entra en este de aquí al menos factor sea igual que 2 haciendo que se incremente a 3
            if ( factor == 2 ) factor++;
            //si no se entra al if anterior se entra en este y lo que hace es aumentar factor en 2.
            else factor += 2;
            //al pasar por aquí todos los valores anteriores pueden haber cambiado lo que hace que lo que dije antes no tenga ningún sentido por que ya no jugaras con esos valores pero el principio son los mismos y no los valores.
        }
 
        //muestra el resultado
        cout << numero << endl;
        //pregunta si calculas otro numero
        cout << "Descomponer otro número?: ";
        cin >> resp;
        //si has pulsado una s mayúscula o minúscula vuelve a iniciar todo otra vez ;)
    } while ( resp[0] == 's' || resp[0] == 'S' );
 
    //si has pulsado otra letra o numero terminara el programa sin pausar
    return 0;
}
He intentado responder el mejor que pude. Es cierto que el source es lioso pero es en las expresiones ifs y elses que esta el truco.
Según lo que introduzcas vas a parar a un lado o a otro cambiando asi los valores y comportamientos del programa.

lo peorcito que veo es que lo que creo que te estas liando es el símbolo ! que puesto delante de una expresion de esta forma !( verdadero ) hace que el resultado se invierta o sea (falso). Si ves algo asi.
int vardadero = 1;
if ( !(verdadero) )
Eso niega que verdadero sea un numero "verdadero". haz la prueba...juega con el símbolo de negación haciendo que cosas como !(10+10) que por cierto es verdadero sea falso y también ! (1 - 1) de verdadero. XD no se dale caña jeje

Si aun sigues con dudas sigue preguntando y si solo tienes duda en una linea pregunta sobre ella ;)
suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

problema para entender ejercicio

Publicado por omar (2 intervenciones) el 06/08/2014 20:46:51
Muchas gracias por tu respuesta y queria hacerte una pregunta:

Para empezar dices que en este codigo if(! ( numero % factor )) cambia el cero por el 1 y el 1 por el 0 que utilidad tiene eso esque no lo entiendo?

En cuanto a los otros ifs mas o menos lo he pillado es decir que despues de dividirlo entre dos y tenga un factor 2 le sume uno para que sea 3 y despues dividirlo entre el numero y luego sumarlos de 2 en 2 para comprobar todos sus factores primos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

problema para entender ejercicio

Publicado por vangodp (287 intervenciones) el 06/08/2014 23:33:22
pues la utilidad que tu quieras. =)
Por ejemplo como el autor del código le interesaba que al dar cero(falso) el resultado de cierta expresión, pues entrar al cuerpo de este if. Sin embargo si no has olvidado como funciona los ifs... y no solo ifs sino while, elseif y compañía XD todos necesitan un verdadero de condición para poder entrar al cuerpo de dicho flujo, y nuestra expresión no arroya un verdadero de resultado sino un falso. Porque cualquier numero par que dividas por 2 va dar cero con el operador modulo % XD. ¿como lo arreglamos eso? pues invirtiendo con el operador !, si me da un falso hago que sea verdadero y entre al if por que el es asi de chulo jejej. ¿Recuerda la película de the matrix?"La realidad se puede alterar y incluso romper" XDDD podemos hacer lo que queramos por que si y ya esta.

% El operador modulo siempre me devuelve la sobra de una división.

Cualquier numero positivo y negativo exceptuando el cero es verdadero en C/C++ y el cero es falso.

Creo que ya con eso no te quedará mas duda =) pero si aun las tienes no te corte en preguntar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar