项目欧拉#29在R

时间:2013-06-02 20:55:48

标签: r

我正在尝试实施以下问题的解决方案: 对于[1,100]中的a和[1,100]中的b,对每个a和b执行a ^ b。我们可以获得多少独特的结果?

在Python中,我可以解决这个问题并获得正确的答案,但是当我尝试R实现时,我无法得到正确的答案。

这是我的代码:

lista=c()
for (b in 2:100){
  for (a in 2:100){
    elemento=a^b
    if (!is.element(elemento,lista)){
      lista=c(lista,elemento)
    }
  }
}


print(length(lista))

3 个答案:

答案 0 :(得分:4)

嗯。我得到了和你一样的答案(虽然快得多)。

length(unique(sort(c(outer(2:100,2:100,"^")))))
## 9183

根据the problem statement,您的代码(从2开始)而不是您的描述(从1开始)是正确的...

我偷了a Python solution

#!/usr/bin/env python
import itertools
print len(set(a**b for a,b in itertools.product(range(2,101), repeat=2)))

给了我相同的答案(9183)[Python的range(m,n)函数似乎提供了从mn-1的值,不像R的seq()捷径{{1}这提供了从:m]

的包含性序列

更新:有人指出R正在对大数字进行不精确的浮点计算 - Python可能也是如此。我们可以使用n包执行此操作,但必须更加谨慎地完成某些事情......

gmp

答案 1 :(得分:3)

最R'ish的方法是使用outer就像@BenBolker一样,它会更快。

现在,如果出于任何原因你想坚持使用嵌套for循环的基本蛮力算法(非常慢),这里有一种方法

res <- vector(mode = "numeric")
for (a in 2:100) {
    for (b in 2:100) {
        tmp <- a^b
      if (!is.element(tmp, res))
          res <- append(res, tmp)
    }
}

length(res)
## [1] 9183


res <- sort(res)
res2 <- sort(unique(c(outer(2:100, 2:100, "^"))))
all.equal(res, res2)
## [1] TRUE

答案 2 :(得分:2)

euler <-  unique(unlist(lapply(2:100, FUN = function(x) x^c(2:100))))

> length(euler)
[1] 9183