在R中创建边界

时间:2018-04-28 11:22:26

标签: r

我正在尝试在R中创建一个函数,它将要求用户输入一个数字,然后说明它是否是阿姆斯壮的数字,然后继续要求用户输入下限和上限然后R将在该间隔内显示阿姆斯壮数字。

这是我到目前为止的代码:

Armstrong <- function() {
  num <- as.integer(readline(prompt="Enter a number: "))
  sum <- 0
  temp <- num
  while(temp > 0) {
    digit <- temp %% 10
    sum <- sum + (digit ^ 3)
    temp <- floor(temp / 10)
  }

我不确定如何修复该功能,以便输入下边界和上边界,然后在该间隔中显示阿姆斯壮的数字字符串。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这是一个答案,它使用Armstrong number的更一般的定义,它是一个等于其数字之和的数字,每个数字都被提升到数字位数的幂:

Armstrong <- function(n){
  digits <- as.numeric(unlist(strsplit(as.character(n),'')))
  k <- length(digits)
  n == sum(digits^k)
}

要查找给定范围内的所有此类数字:

Armstrong.inrange <- function(a,b){
  nums <- a:b
  nums[which(sapply(nums,Armstrong))]
}

例如:

> Armstrong.inrange(0,10000)
 [1]    0    1    2    3    4    5    6    7    8    9  153  370  371  407 1634
[16] 8208 9474

与上述链接的维基百科文章中的部分列表一致。

答案 1 :(得分:0)

也许以下内容符合您的要求 该函数现在有两个参数。然后使用sapply调用内部函数arms进行循环,该函数执行所有工作 请注意,键盘输入使用包wait的函数lava。您需要先使用install.packages("lava")安装它。

Armstrong <- function(Lnum, Unum) {
    if(!require(lava)) stop("Package 'lava' is not installed.")

    arms <- function(num){
        sum <- 0
        temp <- num
        while (temp > 0) {
            digit <- temp%%10
            sum <- sum + (digit^3)
            temp <- floor(temp/10)
        }
        if(num == sum) {
            paste(num, "is an Armstrong number")
        } else {
            paste(num, "is not an Armstrong number")
        }
    }

    Lnum <- wait()
    Unum <- wait()
    unlist(sapply(Lnum:Unum, arms))
}


Armstrong()