Muy Buenas, tengo una duda que esperaba que me pudierais resolver. Solo tengo hecha una parte, me llega a compilar pero no hace lo que se espera del programa.
El ejercicio en cuestion es el siguiente:
/*Crear un programa que lea un fichero llamado
datos.txt que tendra unos numeros (uno por linea)
y muestre por pantalla cual de ellos es primo*/
//ESTA ES LA PARTE QUE TENGO HECHA//
#include <stdio.h>
FILE *fichero;
int numero;
int main (void){
fichero = fopen("datos.txt", "r");
if (fichero == NULL)
printf("ERROR DE APERTURA\n");
else
while(!feof(fichero)){
fscanf(fichero, "%d", &numero);
if((numero % numero == 0) && (numero % 1 == 0))
printf("%d\n", numero);
}
fclose(fichero);
}
No entiendo qué pretendes con esa condición del if.
Intentaba recrear la condicion de que si el numero fuera primo, se imprimiera por pantalla, pero viendolo por segunda vez y detenidamente no tiene sentido :-[
A ver, no es un problema de C, es de aritmetica.
La condición que impones la cumplen todos, no solo los primos. (Todos los numeros son divisibles por 1 y por si mismos).
El matiz es: Solo los numeros primos tienen unicamente como divisores a 1 y a si mismos...
Repasa el libro de mates. Hay muchas maneras de computar si un numero es primo: Yo pongo una de las más sencillas:
"Si un número mayor que 1 no tiene divisores otros que el 1 antes hasta la mitad, entonces es primo. En otro caso, o si es 1 o 0 no es primo "
Va una posible solucion
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
// P : n >= 0
// Q : p = n > 1 and \not (\exits i : 2<= i , 2 <= 2i <= n : n%i = 0)
// O(n)
int prime(const int n)
{
int d;
for(d=2 ; (2*d<=n) && (n%d); d++);
return (n>1)*(2*d > n) ;
}
int main (void){
FILE *f;
int n;
if (!(f = fopen("datos.txt","r")))
{
perror("fopen");
exit(EXIT_FAILURE);
};
while(!feof(f)){
fscanf(f, "%d\n", &n);
if (prime(n)) printf("%d\n", n);
}
fclose(f);
}
Esto es el fichero datos.txt
0
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
Y esto la salida por pantalla
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47