我正在尝试在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)
}
我不确定如何修复该功能,以便输入下边界和上边界,然后在该间隔中显示阿姆斯壮的数字字符串。
非常感谢任何帮助。
答案 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()