找到1到100之间的完美数字

时间:2009-10-12 15:25:45

标签: prolog perfect-numbers

如何生成1到100之间的所有完美数字?

完美数字是一个正整数,等于其适当除数的总和。例如,6(= 1 + 2 + 3)是一个完美的数字。

3 个答案:

答案 0 :(得分:3)

所以我怀疑弗兰克正在寻找Prolog的答案,是的,它确实闻起来homeworky ......

为了好玩,我决定写下我的答案。我花了大约50行。

所以这是我的谓词的轮廓。也许它会帮助你思考Prolog的方式。

  is_divisor(+Num,+Factor)

  divisors(+Num,-Factors)
  divisors(+Num,+N,-Factors)

  sum(+List,-Total)
  sum(+List,+Sofar,-Total)

  is_perfect(+N)

  perfect(+N,-List)

+和 - 实际上不是参数名称的一部分。它们是关于作者期望实例化的文档线索。(NB)“+ Foo”意味着您希望Foo在调用谓词时具有值。 “-Foo”表示您希望在调用谓词时将Foo作为变量,并在完成时给它一个值。 (有点像输入和输出,如果它有助于这样想)

每当你看到一对像sum / 2和sum / 3这样的谓词时,赔率是和/ 2就像是一个总和/ 3的包装,就像accumulator那样。

我没有打算把它打印得很好。您可以直接在Prolog命令行中查询它:

?- perfect(100,L).
L = [28, 6] ;
fail.

我在Prolog谓词中发现的另一件可能有用的事情是,通常有两种。一个是简单地检查某些事情是否属实的一个。对于这种谓词,你希望其他一切都失败。这些往往不需要递归。

其他人希望通过范围(数字或列表)并始终返回结果,即使它是0或[]。对于这些类型的谓词,您需要使用递归并考虑基本情况。

HTH。

注意:这称为“模式”,您可以实际指定它们,编译器/解释器将强制执行它们,但我个人只是在文档中使用它们。还试图找到一个页面,其中包含有关Prolog模式的信息,但我找不到一个好的链接。 :(

答案 1 :(得分:1)

我不确定这是不是你想要的,但你总是可以打印出“6,28”......

答案 2 :(得分:1)

好像你需要循环直到n / 2是n的1/2。划分数字,如果没有余数,那么你可以把它包括在总数中,一旦你已经用尽了1/2的n,那么你检查你的总数是否是你正在测试的数字。

例如:

#include "stdafx.h"
#include "iostream"
#include "math.h"
using namespace std;

int main(void)
{
    int total=0;

    for(int i = 1; i<=100; i++)
    {
        for( int j=1; j<=i/2; j++)
        {
            if (!(i%j))
            {
                total+=j;
            }
        }
        if (i==total)
        {
            cout << i << " is perfect";
        }
        //it works
        total=0;
    }

    return 0;
}