如果该数字的每个数字的立方总和等于数字本身,则数字称为Armstrong Number。
示例:
153 = 1 + 5^3 + 3^3
......所以,153 是阿姆斯特朗号。
142 != 1 + 4^3 + 2^3
......所以,142 不是阿姆斯特朗号。
有人可以帮我编写R中所有3位数阿姆斯特朗数的代码吗?
答案 0 :(得分:12)
使用?strsplit
:
armstrong <- function(x) {
tmp <- strsplit(as.character(x), split="")
cubic <- sapply(tmp, function(y)sum(as.numeric(y)^3))
return(cubic == x)
}
E.g:
armstrong(c(153, 142))
# [1] TRUE FALSE
# find all 3 digit numbers:
s <- 100:999
s[armstrong(s)]
# [1] 153 370 371 407
# @CarlWitthoft: wikipedia was right ;)
答案 1 :(得分:6)
主题的变体......
我的R片段中有Greg Snow的功能。 我会看看以后是否可以挖掘一个链接。这里有一个类似的问题the original answer。它被称为“digits
”,用于在不使用strsplit
的情况下将数字拆分为数字。
digits <- function(x) {
if(length(x) > 1 ) {
lapply(x, digits)
} else {
n <- nchar(x)
rev( x %/% 10^seq(0, length.out=n) %% 10 )
}
}
使用该功能,我们可以执行以下操作:
A <- 100:999
A[sapply(digits(A), function(y) sum(y^3)) == A]
# [1] 153 370 371 407
不幸的是,这是三个函数中最慢的:(
答案 2 :(得分:1)
(a <- rowSums(matrix(as.numeric(unlist(strsplit(as.character(100:999),''))),nrow=900,byrow=TRUE)^3))[a==100:999]
[1] 153 370 371 407