我正在尝试实施以下问题的解决方案: 对于[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))
答案 0 :(得分:4)
嗯。我得到了和你一样的答案(虽然快得多)。
length(unique(sort(c(outer(2:100,2:100,"^")))))
## 9183
根据the problem statement,您的代码(从2开始)而不是您的描述(从1开始)是正确的...
#!/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)
函数似乎提供了从m
到n-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