在R中写一个函数来找到完美的数字

时间:2017-03-10 17:50:27

标签: r perfect-numbers

我是R的初学者,我正在尝试以下问题:

在R中创建一个以其为基础的函数 输入一个自然数N并作为输出返回列表 所有在1和N之间的完美数字。

这里有3个步骤: 1.检查因素列表 2.检查它是否是一个完美的数字 3.检查1到10000

factorlist<-function(n){
if(n<2){return("Invalid Input")}
if(n%%1!=0){return("Invalid Input")}
vec<-0
for(i in 1:(n-1)){
if(n%%i==0){
vec[length(vec)]<-i
vec<-c(vec,0)
}
}
vec<-vec[-length(vec)]
return(vec)
}

perfectcheck<-function(n){
if(n-sum(factorlist(n)) ==0) {return("Perfect Number")}
else{return("Not Perfect Number")}
}



perfectcheckN<-function(N){
for(i in 1:N){
if(perfectcheck(i)=="Perfect Number"){
vec[length(vec)]<-i
vec<-c(vec)
}
}
vec<-vec[-length(vec)]
return(vec)
}

我的第三步出现以下错误

Error in sum(factorlist(n)) : invalid 'type' (character) of argument

我花了几个小时仍然无法弄清楚我的错误,请帮忙。谢谢!

1 个答案:

答案 0 :(得分:2)

factorlist(i)的输出是i==1时的字符。

你的代码中有很多循环和ifs。你可以做到

facs <- function (x) {
    x   <- as.integer(x)
    div <- seq_len(abs(x) - 1L)
    div[x%%div == 0L]
}


perfectcheckN <- function(N){
    out <- 1:N
    out[sapply(out, function(x) x == sum(facs(x)))]
}