Алгоритм для определения надлежащих делителей

Я интересуюсь нахождением чисел, которые показывают свойство наличия суммы их надлежащих делителей, равных числу. Первый пример равняется 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=" ")    )
}

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

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

ОБНОВЛЕНИЕ:

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

D <- function(n) sum((1:(n-1))[n%%1:(n-1)==0])==n
(2:9000)[sapply(2:9000,D)]
5
задан Chase 29 June 2010 в 14:10
поделиться

1 ответ

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

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

Чтобы найти правильные делители, вам следует улучшить его, начав следующим образом:

  • Ваш цикл может останавливаться на sqrt (max)
  • И каждый раз, когда вы находите делитель i, max / i также является делителем, если max / i == i, то это не надо засчитывать.
6
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: