[ Foro de C ]

Problema con un ejercicio propuesto de while

15-Jul-2014 13:44
Invitado (sara)
8 Respuestas



#include<stdio.h>
//Crear un programa calcule cuantas cifras tiene un número entero positivo (pista: se puede hacer dividiendo varias veces entre 10).

int main()
{
  int  x, n_cifras=0;
	printf("Introduce un numero:\n");
	scanf("%d", &x);
	while (x!= 0) 
	{
		x /= 10;
		++n_cifras;
	}  
	printf("Hay %d cifras\n", n_cifras);
return 0;
}



19-Jul-2014 11:07
Nacho Cabanes (+83)

¿Y cuál es el problema o la duda?


19-Jul-2014 15:28
Invitado (sara)

Pues no hay ninguna duda... me he rayado de ejercicio, el que tenía una duda es con este, que no me saca los factores primos... y no sé porque.
Si me puedes ayudar... Gracias :)


int main()
{
	int numero=0;
	int resto=0;
	int cociente=0;
	int x;
	printf("Escribe un numero\n");
	scanf("%d", &numero);
	printf("Los factores primos de ese numero son:\n");
	for (x = 1; x < numero; x++)
	{
		resto = numero % x;
		if (resto == 0 && x != 1)
		{
			cociente = numero / x;
			numero = cociente;
			printf("%d\n", x);
			x=1;
		}
		
	}
return 0;
	
}



19-Jul-2014 15:30
Invitado (sara)

Perdón no lo he mandado bien antes:


#include<stdio.h>
//Crear un programa que descomponga un número (que teclee el usuario) como producto de sus factores primos.


int main()
{
	int numero=0;
	int resto=0;
	int cociente=0;
	int x;
	printf("Escribe un numero\n");
	scanf("%d", &numero);
	printf("Los factores primos de ese numero son:\n");
	for (x = 1; x < numero; x++)
	{
		resto = numero % x;
		if (resto == 0 && x != 1)
		{
			cociente = numero / x;
			numero = cociente;
			printf("%d\n", x);
			x=1;
		}
		
	}
return 0;
	
}



19-Jul-2014 21:49
Nacho Cabanes (+83)

No entiendo la lógica que estás intentando plantear. Acostúmbrate a escribir primero los comentarios que explican lo que vas a hacer, y luego, entre ellos, rellenas el código. Te ayudará a ver si tu lógica es buena, y a asegurarte de que tu programa sigue esa lógica.

En tu caso, el "if" sólo se cumple cuando "x" no es 1, pero al final de la condición (cuando encuentras el primer valor "interesante", 2) le das el valor 1, así que deja de repetirse.


20-Jul-2014 22:06
Invitado (sara)

uff... que lío.!.. a ver pongo el código y a continuación mi duda:


#include<stdio.h>
//Crear un programa que descomponga un número (que teclee el usuario) como producto de sus factores primos.

int main()
{
	int numero;
	int resto;
	int cociente;
	int x=1;
	printf("Escribe un numero\n");
	scanf("%d", &numero);
	printf("Los factores primos de ese numero son:\n");
	
	do
	{ x++;  // no se repite el mismo numero
		resto = numero % x; //calculo el resto
		if (resto == 0 && x != 1) // si el resto el cero y no es uno...
		{	
		// calculo el cociente
			cociente = numero / x;
			numero = cociente;
			printf("%d\n", x);	//valor de x 
		}
	}
	while (x!=1);  
	// Si queremos averiguar los factores primos de 12... sale que es 2*3... MAL
return 0;
	
}


Yo creo que la lógica es buena.. tal vez me equivoco, pero creo que el problema está en x++ ya que si pongo el numero 9, me pone como factor primo solo el 3 así con todos los números en que se repitan el factor primo...
Me da vergüenza preguntar tanto, pero no sé que está mal.
Muchas gracias y perdón por las molestias


21-Jul-2014 00:44
Luis Torres (+18)

En primer lugar tienes un error muy grave que producirá un ciclo infinito cada vez que ejecutes el programa. Se trate de la condición del while, la cual cual siempre será verdadera. En vez de ser (x!=1) debería ser (numero!=1). x siempre será distinto de 1, en cambio numero variará hasta que se convierta en 1, razón por la cual debe finalizarse la ejecución del código.

Eso no solucionaría la lógica del programa, la cual está bien hasta cierto punto. Cuando divides "numero" por un primo, éste valor primo puede dividir exactamente a "numero" mientras que "numero" vaya disminuyendo su valor; pero tú no le das chance de que pruebe nuevamente con ese mismo valor primo. La solución sería incluir un nuevo ciclo dentro del if. Yo hice un código y, aunque no lo he probado mucho, muestra el resultado correctamente para los valores que he introducido. A continuación te lo dejo:


#include <stdio.h>

int main()
{
int numero;
int resto;
int cociente;
int x=1;
printf("Escribe un numero\n");
scanf("%d", &numero);
printf("Los factores primos de ese numero son:\n");
do
{
  x++;
  resto= numero%x;
  if (resto==0 && x!=1)
  {
      do
      {
          printf("%d\n",x);
          cociente= numero/x;
          numero= cociente;
          resto= numero%x;
      }
      while ((resto == 0) && (numero != 1));
  }
}
while (numero != 1);
return 0;
}


Espero que te sirva.

Saludos.


21-Jul-2014 00:44
Nacho Cabanes (+83)

No tengas vergüenza en preguntar, que es la mejor forma de salir de los atascos cuando ya no ves nada claro.

En tu caso, la condición sigue estando mal: miras si "x" vale 1, pero "x" es el divisor, que nunca va a ser 1, porque empiezas en 2. Deberías comprobar si el número ya ha bajado hasta valer 1.

Y la forma de que te vuelva a comprobar el 2 es hacer que no se incremente si el resto ha sido 0, porque entonces deberías volver a comprobar si ese divisor está repetido.

A partir de tu fuente, se podría hacer esto:


#include<stdio.h>
//Crear un programa que descomponga un número (que teclee el usuario) como producto de sus factores primos.


int main()
{
    int numero;
    int divisor = 2;
    printf("Escribe un numero\n");
    scanf("%d", &numero);
    printf("Los factores primos de ese numero son:\n");
    
    do
    { 
        if (numero % divisor == 0) // si es divisible
        {   
            // reduzco el numero
            numero = numero / divisor;
            printf("%d ", divisor); 
        }
        else
			// si no, paso al siguiente
            divisor ++;
    }
    while (numero != 1);  
return 0;    
}


Verás que los cambios no parecen grandes, pero corrigen un par de errores graves, y simplifican, eliminando variables poco necesarias.


21-Jul-2014 13:51
Invitado (sara)

Muchas gracias a los dos.... la verdad que era muy fácil, no sé como no se me ha ocurrido!!! He optado por la propuesta de Nacho Cabanes, me parece más sencilla ya que se utilizan menos variables!!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)