由项目euler 29的julia代码给出的错误答案

由项目euler 29的julia代码给出的错误答案,julia,Julia,我试图解决《朱莉娅》中的欧拉计划第29题,我得到了一个令人痛苦的答案 以下是问题陈述: 考虑2的ab的所有整数组合≤ A.≤ 5和2≤ B≤ 5: 2^2=4, 2^3=8, 2^4=16, 2^5=32 3^2=9, 3^3=27, 3^4=81, 3^5=243 4^2=16, 4^3=64, 4^4=256, 4^5=1024 5^2=25, 5^3=125, 5^4=625, 5^5=3125 如果将它们按数字顺序排列,去掉任何重复项,我们将得到以下15个不同项的序列: 4, 8, 9,

我试图解决《朱莉娅》中的欧拉计划第29题,我得到了一个令人痛苦的答案

以下是问题陈述:

考虑2的ab的所有整数组合≤ A.≤ 5和2≤ B≤ 5:
2^2=4, 2^3=8, 2^4=16, 2^5=32
3^2=9, 3^3=27, 3^4=81, 3^5=243
4^2=16, 4^3=64, 4^4=256, 4^5=1024
5^2=25, 5^3=125, 5^4=625, 5^5=3125
如果将它们按数字顺序排列,去掉任何重复项,我们将得到以下15个不同项的序列:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
a^b为2生成的序列中有多少个不同的项≤ A.≤ 100和2≤ B≤ 100?
这是我的代码,纯粹的暴力

powers = []

n = 100

for a in collect(2:n)
    for b in collect(2:n)
        append!(powers,a^b)        
    end
end

length(unique(powers))
正确答案是9183,但我得到的答案是6143


有人能帮我解决这个问题吗?

您遇到了整数溢出问题-请参阅手册:

您可以通过使用
大整数
解决此问题,如下所示:

powers = []

n = 100

for a in collect(2:n)
    for b in collect(2:n)
        # note the `big()` here
        append!(powers,big(a)^b)        
    end
end

length(unique(powers))

非常感谢@Nils。我还有一些问题。你怎么知道我们什么时候应该使用big,为什么big只用于a而不用于b或a^b?请参阅手册-它告诉你可以表示为Int64的最大整数是2^63-1,所以对于任何较大的整数,你都需要big integer。这里您只需要在
big()
中包装
a
,因为大整数与正则整数的幂运算被定义为
^(x::BigInt,y::integer)=BigInt\u pow(x,y)
(您可以在REPL中执行
@哪个大(2)^63
,以查看正在调用的函数的定义位置并
@编辑大(2)^63检查源代码)请注意,没有理由对
for
-循环中的范围使用
collect
collect
将导致内存分配,这在本例中是不必要的。非常感谢您,Fredrik。实际上,我使用了
collect
来测试一个小数字,只是复制粘贴了它,然后忘了删除它。但是,谢谢你的建议。
powers = []

n = 100

for a in collect(2:n)
    for b in collect(2:n)
        # note the `big()` here
        append!(powers,big(a)^b)        
    end
end

length(unique(powers))