2013-06-02 60 views
3

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

在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

嗯。我可以得到和你一样的答案(尽管速度更快)。

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()快捷键:其中给出了mn]

更新一个包容性的序列:它已经指出的是,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 
+3

这是正确的答案,但我要说有得到它有点运气。虽然你将整数传递给'outer',它会返回一个数字矩阵......还要注意100^100是如何大于'.Machine $ integer.max'。如果OP想要认真对待欧拉项目,他将不得不为大整数建立一个图书馆。当他陷入更困难的问题时,他将能够重复使用和改进。 – flodel

+0

@ flodel你是对的,包'gmp'可以帮助在这种情况下,很好的一点, – dickoa

+0

@ flodel。我打算推荐'bit64'软件包,但是(64位整数)只能使我们达到2^62 ... –

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

> length(euler) 
[1] 9183 
+0

为什么你的答案会给出与其他答案不同的数字? – GSee

+0

@他们改变它从2:100而不是1:100 – jenesaisquoi

+0

正如我在下面的回答中所说的,原始问题陈述与OP陈述的问题之间存在不匹配...... –

3

最R'ish方式做到这一点是OT使用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