2010-06-29 6 views
5

Ich bin daran interessiert, die Zahlen zu finden, die die Eigenschaft aufweisen, dass die Summe ihrer richtigen Teiler gleich der Zahl ist. Das erste Beispiel ist 6, wobei die richtigen Teiler 1 + 2 + 3 = 6 sind.Algorithmus, um richtige Teiler zu bestimmen

Ich habe den folgenden Code in R geschrieben, aber ich fühle, dass es ziemlich ineffizient ist und erheblich verbessert werden kann.

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=" ") ) 
} 

Hat jemand irgendwelche Vorschläge zur Verbesserung des folgenden Codes? Ich denke, eine der Anwendungsfunktionen sollte hier verwendet werden. Vielleicht wäre dies eine anständige Code-Golf-Übung für die Zukunft?

Und wie ich weiß, kommt das hier etwas häufig vor, das ist KEIN Hausaufgabenproblem, nur etwas, was ein Kollege früher als interessanter Kodierungsherausforderer stellte.

UPDATE:

Vielen Dank an alle für Ihre Kommentare und Gedanken an Orte für weitere Informationen zu suchen. Hier ist eine andere Lösung, die sapply nutzt:

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

Sie Vielleicht möchten Sie hier einen Blick auf Ihre Ergebnisse werfen: http://www.research.att.com/~njas/sequences/A000396 – nico

Antwort

6

Was Sie suchen sind aufgerufen, vollkommene Zahlen (Summe der echten Teiler gleich der Zahl selbst).

Wenn Sie versuchen, den Ansatz selbst zu verbessern, see here.

richtigen Divisoren zu finden, sollten Sie, als Start wie folgt verbessern:

  • Ihre Schleife kann
  • Und jedes Mal, wenn Sie einen Divisor finden bei sqrt (max) stoppen i, max/i ist ein Divisor auch wenn max/i == i dann sollte es nicht gezählt werden.
+1

Sie können auch damit beginnen, ungerade Zahlen zu verwerfen (siehe Link in meinem Kommentar zu der Frage) – nico

+0

Sie können auch in der Wikipedia auf perfekte Zahlen interessiert sein, die auf eine Liste von bekannten perfekten Zahlen (bis zu 25.956.377 Ziffern) verweist. – nullglob

2

Die Zahlen der Form von 2^(n-1) * (2^n-1) sind perfekt Zahlen, wenn 2^n - 1 eine Primzahl ist

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; 
} 

~