3

我正在尝试解决以下问题:对于 [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))
4

3 回答 3

4

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

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

根据问题陈述,您的代码(从 2 开始)而不是您的描述(从 1 开始)是正确的......

我偷了一个 Python 解决方案

#!/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)函数似乎给出了从mton-1包含的值,这与 R 的seq()快捷方式不同:,它给出了从mto的包含序列n]

更新:有人指出,R 正在对大数进行不精确的浮点计算——Python 可能也是如此。我们可以用gmp包做到这一点,但事情必须做得更仔细......

library("gmp")
v <- as.bigz(2:100)
uu <- do.call("c",sapply(v,function(x) x^v))
length(unique(uu))  ## 9183 again 
于 2013-06-02T21:04:58.597 回答
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
于 2013-06-02T21:42:24.660 回答
2
euler <-  unique(unlist(lapply(2:100, FUN = function(x) x^c(2:100))))

> length(euler)
[1] 9183
于 2013-06-02T21:07:41.323 回答