【问题标题】:PROLOG: How to know if a number is a perfect number?PROLOG:如何知道一个数字是否是一个完美的数字?
【发布时间】:2025-11-27 02:00:02
【问题描述】:

一个完全数等于除自身之外的所有除数之和。 例如6 = 1+2+3,那么 6 是一个完美的数字。

我想知道如何在 PROLOG 中实现这一点。

你能给我一些想法吗?

【问题讨论】:

  • 欧拉项目,是你吗?
  • @Steven 你需要它非常高效吗?您要处理的数字有多大?

标签: prolog perfect-numbers


【解决方案1】:

-你好 Steven,你现在可能已经知道 PROLOG 是一种声明性语言,我们使用关系来表达程序逻辑。

你的任务是表达给定数字与其除数之和之间的关系。为了找到总和,您必须遍历从 1 到 Number-1 的所有可能整数(因为 Number 不会包含在总和中)并测试给定整数是否是输入数字的除数。 如果整数是除数,则将其添加到当前总和中,增加整数并重复任务,直到达到与输入数字具有相同值的整数。一旦你到达那里,你所要做的就是检查总和(如果总和等于我们输入的数字,我们就有一个完美的数字,否则我们没有)。下面给出了我们需要的谓词:

perfectNumber(Number) :- perfectNumber(Number,1,0).

perfectNumber(Number,Number,Sum):- Number = Sum.
perfectNumber(Number,CurrDivisor,CurrSum) :-  not(CurrDivisor = Number),
                                              NewDivisor is CurrDivisor+1,
                                              0 is mod(Number,CurrDivisor), 
                                              NewSum is CurrSum+CurrDivisor,
                                              perfectNumber(Number,NewDivisor,NewSum).

perfectNumber(Number,CurrDivisor,CurrSum) :- not(CurrDivisor = Number),
                                             NewDivisor is CurrDivisor+1,perfectNumber(Number,NewDivisor,CurrSum).

让我知道你的想法。

【讨论】:

  • 您实际上需要从2 迭代到sqrt(N),因为没有任何大于sqrt(N) 的元素可以在不休息的情况下分割N