测试输入的Int是否是完美数字

时间:2018-02-14 00:03:48

标签: haskell perfect-numbers

我一直在寻找完美的数字,我在rosettacode上发现了这段有趣的代码:

$defaultQuery = mysqli_query($con, "SELECT fullname, company, id FROM employees WHERE company = '$topCID' AND `id` != '$eid' UNION ALL SELECT fullname, company, id FROM users WHERE company = '$topCID' ORDER BY RAND() LIMIT 6");

现在,我明白了一个完美的数字是什么,我知道哪些数字被认为是完美的,但是我很难弄清楚这些代码的哪些部分可以做什么。

我知道它正在计算输入数字的因素,并将它们组合在一起以查看它是否与输入本身匹配,但我不确定它是如何做到这一点的。

如果有人能够以初学者友好的方式分解这些代码,我会非常感激。

2 个答案:

答案 0 :(得分:7)

n == sum [i | i <- [1..n-1], n `mod` i == 0]
              ^^^^^^^^^

i1n-1(即[1, 2, 3, 4 ... n-1]

n == sum [i | i <- [1..n-1], n `mod` i == 0]
                              ^^^^^^

仅适用于i均分n的值。丢弃与此要求不符的值。

n == sum [i | i <- [1..n-1], n `mod` i == 0]
         ^^^

在结果列表中包含i

n == sum [i | i <- [1..n-1], n `mod` i == 0]
     ^^^^

将此列表的元素添加到一起。

n == sum [i | i <- [1..n-1], n `mod` i == 0]
^^^^

如果总数等于True,则返回n

答案 1 :(得分:3)

[i | i <- [1..n-1], n `mod` i == 0]

从中间开始,您可以这样阅读:对于i列表的每个元素[1..n-1],请检查n `mod` i是否等于0。如果是,请在结果列表中包含i(这是|左侧的部分。不使用列表推导语法,可以使用filter函数编写:< / p>

filter (\i -> n `mod` i == 0)

然后将结果列表的元素添加sum,最后,测试总和与n的相等性。