0votos

Número perfecto en C

por josejuan hace 6 años

Sin una propiedad local que permita filtrar los perfectos, creo que lo mejor es usar una variante de la criba de Eratóstenes, es decir, mantener un vector para ir restando los divisores. De este modo, sacamos todos los perfectos en un rango. La pega obviamente es que debemos tener mucha memoria, a cambio, no hay que hacer divisiones y los obtenemos todos.

Un número perfecto es aquel que es igual a la suma de todos sus divisores positivos excepto el mismo.

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
#include <stdio.h> 
#include <stdlib.h> 
 
void main(int argc, char **argv) { 
  int n = atoi(argv[1]); 
  int *v = (int*) malloc(n * sizeof(int)), z, q, *w; 
  for(z = 0; z < n; z++) v[z] = z; 
  for(z = 2, v++; z < n; z++, v++) { 
    if(!*v) printf("%i\n", z); 
    for(q = z + z, w = v + z; q < n; q += z, w += z) *w -= z; 
 
/* 
> nperfectos 34000000 
28 
496 
8128 
33550336 
 
 
Tiempos: 
- Xeon 3,2 Ghz -> ~5 seg 
- Athlon 2 Ghz -> ~16 seg 
*/ 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.