2010-06-29 3 views
5

Меня интересует поиск чисел, которые обладают свойством наличия суммы их собственных делителей, равных числу. Первый пример равен 6, где правильные делители 1 + 2 + 3 = 6.Алгоритм определения правильных делителей

Я написал следующий код в R, но я чувствую, что он довольно неэффективен и может быть значительно улучшен.

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

У кого-нибудь есть предложения по улучшению следующего кода? Я считаю, что здесь нужно использовать одну из функций приложения. Может быть, это будет достойная игра для гольфа на будущее?

И, как я знаю, это часто встречается здесь, это НЕ проблема домашних заданий, а именно что-то вроде коллеги, ставшего сегодня интересным соперником по кодированию.

UPDATE:

Спасибо всем за ваши комментарии и мысли на местах искать для получения дополнительной информации. Вот еще одно решение, которое использует sapply:

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

Вы может захотеть посмотреть здесь, чтобы проверить ваши результаты: http://www.research.att.com/~njas/sequences/A000396 – nico

ответ

6

Что вы ищете, называется совершенными числа (сумма собственных делителей равно само число).

Если вы хотите улучшить сам подход, see here.

Чтобы найти правильные делители вы должны улучшить, как начала, как это:

  • Ваш цикл может остановиться на SQRT (макс)
  • И каждый раз, когда вы найти делитель я, макс/я является divisor тоже, если max/i == i, тогда его не следует считать.
+1

Также вы можете начать с отбрасывания нечетных чисел (см. ссылку в моем комментарии к вопросу) – nico

+0

Вы также можете быть заинтересованы в Википедии о совершенных числах, которые ссылаются на список известных совершенных чисел (до 25 956 377 цифр). – nullglob

2

Числа вида 2^(п-1) * (2^п -1) являются совершенные числа, если 2^п - 1 является простым

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

~