R中的Euler#29项目

R中的Euler#29项目,r,R,我正在尝试实现以下问题的解决方案: 对于[1100]中的a和[1100]中的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,eleme

我正在尝试实现以下问题的解决方案: 对于[1100]中的a和[1100]中的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))

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

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

我偷了

这给了我相同的答案(9183)[Python的
范围(m,n)
函数似乎给出了从
m
n-1
的值,这与R的
seq()
快捷方式
不同,后者给出了从
m
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 
库(“gmp”)
v
euler长度(euler)
[1] 9183

最简单的方法是不要像@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

res这是正确的答案,但我想说得到它是有点运气的。虽然您将整数传递给外部
,但它会返回一个数值矩阵。。。还要注意100^100如何大于
.Machine$integer.max
。如果OP想认真对待Euler项目,他必须为大整数建立一个库。当他遇到更难的问题时,他将能够重新使用和改进。@flodel你是对的,这个包
gmp
可以帮助他解决这个问题case@flodel,说得好。我本来打算建议使用
bit64
软件包,但是(64位整数)最多只需要2^62…那就是作弊!另外,我收回了我说过的话:返回数字的不是
outer
,而是
^
,我觉得这有点奇怪(例如参见
class(1L^1L)
),我不知道作弊。使用软件包的规则是什么?我复制的Python解决方案使用了
itertools
…为什么您的答案给出的数字与其他答案不同?@GSee他们将其从2:100改为1:100。正如我在下面的答案中所说,原始问题陈述与操作说明的问题不匹配。。。
library("gmp")
v <- as.bigz(2:100)
uu <- do.call("c",sapply(v,function(x) x^v))
length(unique(uu))  ## 9183 again 
euler <-  unique(unlist(lapply(2:100, FUN = function(x) x^c(2:100))))

> length(euler)
[1] 9183
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