2010-06-29 12 views
5

Estoy interesado en encontrar los números que exhiben la propiedad de tener la suma de sus divisores adecuados igual al número. El primer ejemplo es 6, donde los divisores adecuados son 1 + 2 + 3 = 6.Algoritmo para determinar los divisores adecuados

Escribí el siguiente código en R, pero creo que es bastante ineficiente y puede mejorarse significativamente.

propDivisor <- function(
    max 
) 
{ 
    n<-{} 
    for(j in 2:max){ 
     m<-{} 
     for(i in 1:(j/2+1)){ 
      if(j%%i==0){m<-c(m,i)} 
     } 
     if(sum(m)==j){n<-c(n,j)} 
    } 
return(cat("The proper divisors between 1 and", max, "are", n, ".", sep=" ") ) 
} 

¿Alguien tiene alguna sugerencia para mejorar el siguiente código? Creo que una de las funciones de aplicar debería usarse aquí. Tal vez esto sería un ejercicio decente de golf de código para el futuro?

Y como sé que esto aparece con cierta frecuencia aquí, esto NO es un problema de tarea, simplemente algo que un compañero de trabajo planteó como un retador de codificación interesante el día de hoy.

ACTUALIZACIÓN:

Gracias a todos por sus comentarios y pensamientos en lugares en busca de más información. Aquí hay otra solución que utiliza sapply:

D <- function(n) sum((1:(n-1))[n%%1:(n-1)==0])==n 
(2:9000)[sapply(2:9000,D)] 
+1

Usted Quizás quiera echar un vistazo aquí para verificar sus resultados: http://www.research.att.com/~njas/sequences/A000396 – nico

Respuesta

6

Lo que estamos buscando son llamados números perfectos (suma de divisores propios es igual al número en sí).

Si está buscando mejorar el enfoque en sí, see here.

Para encontrar divisores apropiados que debe mejorar, como un comienzo así:

  • su bucle puede parar en sqrt (max)
  • Y cada vez que encuentre un divisor i, máx/i es una divisor también a menos que max/i == i entonces no debería ser contado.
+1

Además, puede comenzar descartando números impares (ver el enlace en mi comentario a la pregunta) – nico

+0

También le puede interesar la Wikipedia sobre números perfectos, que enlaza con una lista de números perfectos conocidos (hasta 25,956,377 dígitos). – nullglob

2

Los números de la forma de 2^(n-1) * (2^n-1) son números perfectos si 2^n - 1 es primo

0
#include<stdio.h> 
#include<math.h> 
int main() 
{ 
     int t; 
     scanf("%d",&t); 
     while(t--) 
     { 
       long long int n,i,sum= -n; 
       scanf("%lld",&n); 
       for(i=1;i<=sqrt(n);i++) 
       { 
         if(n%i==0) 
         sum = sum + i + n/i; 
       } 
       printf("%lld\n",sum); 
     } 
     return 0; 
} 

~

Cuestiones relacionadas