r中的阿姆斯特朗号码计划

use*_*387 3 r

如果该数字的每个数字的立方总和等于数字本身,则数字称为阿姆斯壮数.

例:

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

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

有人可以帮我编写R中所有3位数阿姆斯特朗数的代码吗?

sgi*_*ibb 12

一个快速而肮脏的解决方案?strsplit:

armstrong <- function(x) {
  tmp <- strsplit(as.character(x), split="")  
  cubic <- sapply(tmp, function(y)sum(as.numeric(y)^3))
  return(cubic == x)
}
Run Code Online (Sandbox Code Playgroud)

例如:

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 ;)
Run Code Online (Sandbox Code Playgroud)

  • 虽然阿姆斯特朗的数字很少使用,但这段代码片段是如何使用整数数字的一个很好的例子.但我应该给你-1为mipselling"Armstrong":-) (3认同)

A5C*_*2T1 6

主题的变化......

我的R片段中有Greg Snow的功能.我会看看以后我是否可以挖掘一个链接.这是一个有点类似问题的原始答案.它被称为" 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 )
  }
}
Run Code Online (Sandbox Code Playgroud)

使用该功能,我们可以执行以下操作:

A <- 100:999
A[sapply(digits(A), function(y) sum(y^3)) == A]
# [1] 153 370 371 407
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是三个函数中最慢的:(

  • 对于这个应用程序,您也可以放弃对"rev"的调用,因为您只需要立方并添加数字,顺序无关紧要. (2认同)