如何生成1到100之间的所有完美数字?
完美数字是一个正整数,等于其适当除数的总和。例如,6(= 1 + 2 + 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;
}