R中的Euler#29项目
我正在尝试实现以下问题的解决方案: 对于[1100]中的a和[1100]中的b,对每个a和b执行a^b。我们能获得多少独特的结果 在Python中,我可以解决这个问题并得到正确的答案,但是当我尝试R实现时,我无法得到正确的答案 这是我的密码: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
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”)
veuler长度(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