[ Foro de C ]
#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;
}
¿Y cuál es el problema o la duda?
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;
}
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;
}
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.
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
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.
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.
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.)