2

阿姆斯壮数字是数字本身等于其数字之和的数字之和的数字次幂。

例子:

  • 153 = 1^3 + 5^3 + 3^3
    ...所以,153阿姆斯特朗数。

  • 142 != 1^3 + 4^3 + 2^3
    ...所以,142不是阿姆斯特朗数。

有人可以帮我编写 R 中所有 3 位 Armstrong 数字的代码吗?

4

3 回答 3

13

一个快速而肮脏的解决方案,使用?strsplit

armstrong <- function(x) {
  tmp <- strsplit(as.character(x), split="")  
  y <- sapply(tmp, function(y)sum(as.numeric(y)^length(y)))
  return(y == x)
}

例如:

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 ;)
于 2013-09-13T12:50:38.920 回答
6

一个主题的变体...

我的 R 代码片段中有一个来自 Greg Snow 的函数。稍后我会看看我是否可以挖掘一个链接。这是一个有点相似的问题的原始答案。它被称为“ digits”,用于将数字拆分为数字而不使用strsplit.

digits <- function(x) {
  if(length(x) > 1 ) {
    lapply(x, digits)
  } else {
    n <- ceiling(log10(x))
    x %/% 10^seq(0, length.out=n) %% 10
  }
}

使用该函数,我们可以执行以下操作:

A <- 100:999
A[sapply(digits(A), function(y) sum(y^length(y))) == A]
# [1] 153 370 371 407

不幸的是,它是这里三个功能中最慢的:(

于 2013-09-13T13:47:25.203 回答
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
于 2013-09-13T13:28:38.550 回答