回答
嘛看起来你需要循环,直到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;
}
顺便说一下,它可以被优化的人我知道,但它的工作在可读代码:) – JonH 2009-10-12 15:55:17
顺便说一句,这是用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
所以我怀疑弗兰克寻找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模式的信息页面,但我找不到一个好的链接。 :(
- 1. 用C程序找到完美数字
- 2. 用C语言编写的1到100之间的素数
- 3. 如何在1到100的整数数组中找到缺失的数字?
- 4. 在sqlite中选择一个范围(1到100)之间的数字
- 5. 如何给用户输入1到100之间的数字使用jquery或javascript
- 6. 如何在C中找到完美的数字10^18?
- 7. 两个数字之间的完美力量
- 8. 之间找到{}
- 9. 高效找到完美广场
- 10. 得到0之间的轮数为1
- 11. 显示1到100之间的所有7的倍数的程序C++
- 12. 0到100之间的输入验证
- 13. 找到100的范围和他们的计数之间的数值
- 14. 生成0到1之间的100个随机数并冻结它
- 15. animate 100 divs 1之后1
- 16. 用gperf找到最小的完美哈希函数
- 17. WinForms文本框只允许1到6之间的数字
- 18. 打印1到1000000之间的阿姆斯壮数字
- 19. 指定1到5之间的数字列
- 20. Flash Slider错过了1到360之间的数字....为什么?
- 21. 大整数整数的完美散列函数[1..2^64-1]
- 22. 完美的圆到完美的圆和完美的圆到直线的碰撞Java中的处理
- 23. 如何找到两个特定字符串之间的数字?
- 24. 查找值到数值之间的值
- 25. 找到日期之间的天数C#
- 26. 找到2日期之间的天数?
- 27. 数字格式从美分到美元
- 28. 遍历数组并找到数字范围之间的和
- 29. 时间戳格式 - 从1/1000秒到1/100秒
- 30. 从1到100打印偶数,每行5个数字
“无”(序言笑话) – 2009-10-12 16:44:06