我的代码用于检查一个数字是否是一个崇高的数字,但奇怪的是,它对于 12 的倍数(本身就是一个崇高的数字)失败了。有谁知道为什么吗?

问题描述 投票:0回答:1

我是 Julia 的新手,为了好玩而编写了一些代码。我当前的项目正在创建代码来检查一个数字是否崇高。对于上下文(我想是一些琐事),一个崇高的数字 n 由两个品质定义:

  1. 被除数的个数(包括n)是一个完美数
  2. 除数之和(包括n)是一个完美数 (完美数字具有其除数之和(不包括数字本身)的性质,其总和等于数字本身)

12 是一个伟大的数字,我怀疑这就是我收到其大部分倍数错误消息的原因。 我的代码(如下所示 - 我是 Julia 的新手,所以要做好低效率的准备)可以像任何其他数字一样工作。

除了 36、72、144、288 之外,每个 12 的倍数都会出现 BoundsError 消息(因此是第 3 个、第 6 个、第 12 个、第 24 个,我假设之后的每个倍数都遵循该序列)。我很想知道为什么,如果有人能够提供帮助,我将非常感激。

这是代码:

function sublime(n)
           ncheck = zeros(Int64, n)
           k = 1

               for k = 1:n
                   if rem(n,k) == 0
                       ncheck[k] = k
                   else
                       #do nothing
                   end
               end
           ncheck = filter!(x -> x != 0, ncheck)

           divsum = sum(ncheck)
           sumcheck = zeros(Int64, divsum)
               for k = 1:(divsum-1)
                   if rem(divsum, k) == 0
                       sumcheck[k] = k
                   else
                       #do nothing
                   end
               end
           sumcheck = filter!(x -> x != 0, sumcheck)

           divnum = size(ncheck,1)
           lcheck = zeros(Int64, divnum)
               for k = 1:(divnum-1)
                   if rem(divnum, k) == 0
                       lcheck[k] = k
                   else
                       #do nothing
                   end
               end
           lcheck = filter!(x -> x != 0, lcheck)

           if sum(lcheck) == divnum & sum(sumcheck) == divsum
               println("y")
           else
               println("n")
           end
       end

基本上,我正在创建一个长度为 n 且仅包含零的数组(称为“ncheck”),检查哪些数字 k < n result have a remainder of 0, updating the array to include those k, and deleting every 0.

然后我创建一个长度为“divsum”的数组“sumcheck”,表示n的除数之和。我重复上面的过程。检查余数为 0 的内容并删除数组中剩余的零。

最终的数组是“lcheck”,长度为“divnum”,表示n的除数数。与上面的过程相同,只留下余数为 0 的除数。

最后,我检查 lcheck 中的条目之和是否等于 ncheck 的长度,以及 sumcheck 中的条目之和是否等于 n 中的除数之和。如果两者都是真的,那么我手上就有一个崇高的数字,如果其中一个或两者都是假的,我就没有。

这是 12 的错误,这是一个崇高的数字:

sublime(12)

ERROR: BoundsError: attempt to access 12-element Vector{Int64} at index [14]
Stacktrace:
 [1] setindex!
   @ .\array.jl:969 [inlined]
 [2] sublime(n::Int64)
   @ Main .\REPL[49]:19
 [3] top-level scope
   @ REPL[78]:1

为了进行比较,以下是 24 和 48 的错误消息:

sublime(24)

ERROR: BoundsError: attempt to access 24-element Vector{Int64} at index [30]
Stacktrace:
 [1] setindex!
   @ .\array.jl:969 [inlined]
 [2] sublime(n::Int64)
   @ Main .\REPL[49]:19
 [3] top-level scope
   @ REPL[80]:1
sublime(48)

ERROR: BoundsError: attempt to access 48-element Vector{Int64} at index [62]
Stacktrace:
 [1] setindex!
   @ .\array.jl:969 [inlined]
 [2] sublime(n::Int64)
   @ Main .\REPL[49]:19
 [3] top-level scope
   @ REPL[82]:1

希望我的信息可以为解决当前问题提供一些线索!

julia indexoutofboundsexception
1个回答
0
投票

问题是,在 Julia 中,

&
是按位
and
,而
&&
是布尔值
and

6 & 28 # equals 4, because the bitwise and of 110 and 11100 is 100 (i.e. 4 in decimal)

6 && 28 # equals ERROR: TypeError: non-boolean (Int64) used in boolean context
© www.soinside.com 2019 - 2024. All rights reserved.