2009-10-12 131 views
0

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

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

+3

“无”(序言笑话) – 2009-10-12 16:44:06

回答

1

我不知道如果这是你要找的人,但你总是可以只打印出“6 28” ......

+2

你的名字是你的程序? – markus 2009-10-12 15:50:09

+0

........... ;-) – arno 2009-10-12 15:56:38

+0

唉呦,我总是用预处理程序在我的脑海做我可以随时编程。我非常喜欢这一款的优雅。 :) – Clueless 2009-10-12 16:09:09

1

嘛看起来你需要循环,直到N/2是是n的1/2。划分数字,如果没有剩余,那么你可以将它包括在总数中,一旦你用尽了n的1/2,那么你检查你的总和=你测试的数字。

例如:

#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; 
} 
+0

顺便说一下,它可以被优化的人我知道,但它的工作在可读代码:) – JonH 2009-10-12 15:55:17

+0

顺便说一句,这是用C++完成的,你可以在C#中完成, VB.net或任何其他语言j请遵循它背后的逻辑。第一次循环直到包括100,因为你说你正在寻找任何完美的数字,直到100.然后第二个循环被用作除数,并达到直到i/2是你的n的1/2。如果没有余数!(i%j),这意味着它平均分配,你可以把它包括在你的总和中。否则保持循环。一旦你退出循环,即j = i/2,那么你只需检查你的累计总数是否是你原来的n(i)。如果他们相等,那就是一个完美的数字! – JonH 2009-10-12 15:57:35

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) 

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

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

我没打算让它打印出来很好。你可以直接查询它在Prolog的命令行:

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

可能会有所帮助,我发现与Prolog的谓词的另一件事是,一般有两种。一个是简单地检查是否有事。对于这种谓词,你希望一切都失败。这些不需要递归。

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

HTH。

注:这就是所谓的“模式”,实际上,你可以指定他们和编译器/解释器将执行它们,但我个人只是用他们的文档。还试图找到一个关于Prolog模式的信息页面,但我找不到一个好的链接。 :(