Я интересуюсь нахождением чисел, которые показывают свойство наличия суммы их надлежащих делителей, равных числу. Первый пример равняется 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)]
То, что вы ищете, называется совершенными числами (сумма собственных делителей равна самому числу).
Если вы хотите улучшить сам подход, см. Здесь .
Чтобы найти правильные делители, вам следует улучшить его, начав следующим образом: