在Python中,我可以执行以下操作来获取N
中所有数字的总和,其中N=99999 ** 99999
。可以使用sum(map(int,str(N)))
获得总和。
如何在Julia中找到N中所有数字的总和?
答案 0 :(得分:5)
你正在击中整数溢出。尝试使用BigInt
s。
julia> N=digits(big(99999)^99999)
499995-element Array{Int64,1}:
9
9
9
9
9
8
9
9
9
9
⋮
5
0
8
2
1
8
8
7
6
3
请注意
julia> typemax(Int64)
9223372036854775807
太小了,但BigInt
s是任意大小的。 big(i)
将i
变为大(BigFloat
(如果它是浮点数),BigInt
(如果它是整数)。 Julia并不默认使用bigs /任意大小的数字,因为它们很慢,但如果你调用它们,那么大多数调度的类型稳定性将传播大类型,因此big(i)^j
最终会变大。
答案 1 :(得分:0)
这个问题有点老了,但是我发现了一个有趣的性能改进,至少对于使用Julia 1.5或更早版本的用户来说,对新用户(或者更高级的用户可以解释)很有用。
默认情况下,Julia将{9991”强制转换为Int64
。但是,99999⁹⁹⁹⁹⁹是一个很大的数字,不适合Int64
变量(最多支持2⁶³)。然后,您必须使用big(99999)
或等效的BigInt(99999)
(Python会自动执行)。
一个人可以写
sum(digits(big(99999)^99999))
它绝对有效。进行一些基准测试,我发现:
>>> %timeit sum(map(int,str(99999**99999)))
4.9 s ± 5.43 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
julia> @benchmark sum(digits(big(99999)^99999))
BenchmarkTools.Trial:
memory estimate: 142.75 GiB
allocs estimate: 5343475
--------------
minimum time: 79.833 s (3.24% GC)
median time: 79.833 s (3.24% GC)
mean time: 79.833 s (3.24% GC)
maximum time: 79.833 s (3.24% GC)
--------------
samples: 1
evals/sample: 1
我知道。朱莉娅是“光速之上”,“比C和Fortran更快”的语言。为什么它会(比)“ Python”(“海龟语言”)慢得多?以及我们如何处理分配的大量内存? 让我们尝试一下用Julia重写的“ pythonic”算法:
julia> sum(map(x -> parse(Int32, x), collect(string(big(99999)^99999))))
我知道这听起来很奇怪并且违反直觉,但是数字说明了一切。这是我的结果。
julia> @benchmark sum(map(x -> parse(Int32, x), collect(string(big(99999)^99999))))
BenchmarkTools.Trial:
memory estimate: 13.56 MiB
allocs estimate: 991
--------------
minimum time: 62.130 ms (0.00% GC)
median time: 63.111 ms (0.00% GC)
mean time: 63.183 ms (0.24% GC)
maximum time: 66.055 ms (0.68% GC)
--------------
samples: 80
evals/sample: 1
备注。
%timeit
是IPython的魔力。 @benchmark
是由BenchmarkTools.jl实现的宏(需要安装)。Int8
来映射字符串来改进内存分配,但是时间完全相同。总而言之,它可以在Julia中完成,既可以使用简单但缓慢的代码,也可以使用冗长但快速的代码。我无法确切解释为什么。
答案 2 :(得分:-1)
你在寻找的是sum(digits(N))
(人们必须爱Julia,因为它很简单!)。
julia> N=99999^99999
7466109992980035935
julia> sum(digits(N))
95
答案 3 :(得分:-1)
总而言之。
sum(digits(big(99999)^99999))