我一直在寻找完美的数字,我在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");
现在,我明白了一个完美的数字是什么,我知道哪些数字被认为是完美的,但是我很难弄清楚这些代码的哪些部分可以做什么。
我知道它正在计算输入数字的因素,并将它们组合在一起以查看它是否与输入本身匹配,但我不确定它是如何做到这一点的。
如果有人能够以初学者友好的方式分解这些代码,我会非常感激。
答案 0 :(得分:7)
n == sum [i | i <- [1..n-1], n `mod` i == 0]
^^^^^^^^^
i
从1
到n-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
的相等性。