不能被几个数字整除的整数

时间:2015-10-17 16:08:38

标签: r

我正在尝试打印一个介于1和100之间的向量,这些向量在R中不能被2,3和7整除。

我尝试了seq,但我不确定如何继续。

6 个答案:

答案 0 :(得分:7)

另一个选择是使用Filter,以及过滤任何符合您条件的数字的序列:

Filter(function(i) { all(i %% c(2,3,7) != 0) }, seq(100))
## [1]  1  5 11 13 17 19 23 25 29 31 37 41 43 47 53 55 59 61 65 67 71 73 79 83 85 89 95 97

请注意,虽然这可能(IMO)最具可读性,但在性能方面却是最糟糕的(到目前为止):

更新以考虑rawr的for循环解决方案:

microbenchmark(
  filter={ v1 <- seq(100); Filter(function(i) { all(i %% c(2,3,7) != 0) }, v1) },
  reduce={ v1 <- seq(100); v1[!Reduce(`|`,lapply(c(2,3,7), function(x) !(v1 %%x)))] },
  rowout={ v1 <- seq(100); v1[rowSums(outer(v1, c(2, 3, 7), "%%") == 0) == 0] },
  looopy={ v1 <- seq(100); for (ii in c(2,3,7)) v1 <- v1[-which(v1 %% ii == 0)]; v1 },
  times=1000
)

## Unit: microseconds
##    expr     min       lq      mean   median       uq      max neval cld
##  filter 108.280 118.7000 143.88592 126.2155 136.6290 2349.952  1000   c
##  reduce  21.552  23.8095  25.91997  24.8150  25.8580  144.067  1000 ab 
##  rowout  26.075  28.4920  31.11812  29.5350  31.2125  184.225  1000  b 
##  looopy  14.149  16.0765  18.11806  16.8995  17.8595  160.485  1000 a  

为了公平起见我向所有人添加了序列生成(而且,我这样做是为了比较相对性能与实际速度,所以比较结果仍然有效。)

原始声明:

“不出所料,akrun是最佳的:-)”

现在被取代:

“毫不奇怪,rawr是最佳的:-)”

答案 1 :(得分:5)

我们可以使用模数运算符使用lapply循环执行此操作,通过否定(!)将0转换为TRUE,使用Reduce使用|来查找相应的list元素为TRUE,否定和“v1”

的子集
v1[!Reduce(`|`,lapply(c(2,3,7), function(x) !(v1 %%x)))]

或者不是循环,这也可以更快的方式完成。

 v1[!(!v1%%2) + (!v1%%3) + (!v1%%7)]

数据

v1 <- seq(100)

答案 2 :(得分:4)

基本上你想要计算1:100模2,3和7中的每个数字。你可以使用outer在单个向量化操作中执行所有模运算,使用{{1识别rowSums中未完全除以2,3或7的元素。

1:100

答案 3 :(得分:3)

其他答案更好,但如果你真的需要使用for循环,如this question所示,这可能是一种可能性:

x <- vector()
n <- 1L
for(i in 1:100){if (i%%2!=0 & i%%3!=0 & i%%7!=0) {x[n] <- i;  n <- n+1}}
#> x
# [1]  1  5 11 13 17 19 23 25 29 31 37 41 43 47 53 55 59 61 65 67 71 73 79 83 85 89 95 97

如前所述,此处发布的其他答案更好,因为它们利用了R的矢量化功能。此处显示的短代码可能比任何其他答案都慢,维护起来更复杂。它是应用于R的其他编程语言(如C或FORTRAN)的典型语法。它可以工作,但它不是应该完成的方式。

答案 4 :(得分:0)

我们可以通过倒计时轻松生成负模数序列,而不是明确地使用模运算。然后,对于三个序列中的每一个,我们可以将它们全部OR,然后将其放入which()

 which(as.logical(pmin(rep_len(1:0, 100), 
                       rep_len(2:0, 100),
                       rep_len(6:0, 100))))

如果我们希望硬编码少一点,我们可以将do.calllapply()一起使用:

which(as.logical(do.call(pmin, lapply(c(2,3,7)-1, function(x)rep_len(x:0, 100)))))

编辑:

以下是使用逻辑的一种方法:

v1 <- logical(100); for (ii in c(2,3,7) -1) v1 <- v1 | rep_len(rep(c(F,T), c(ii,1)), 100) ; which(!v1)

答案 5 :(得分:-1)

我在课堂上遇到了同样的问题。我假设老师给了我找到答案所需的所有信息,我是正确的。这是第一周,其他高级人员使用的所有其他愚蠢的东西都没有出现。
不过我是这样做的。

r = c(1:100)
which(r %% 3 == 0 & r %% 7 == 0 & r %% 2 == 0)

使用 which 函数。