你不需要迭代循环 for i := 1 to x-1 但 for i := 2 to trunc(sqrt(x)) 。 最高整数除数是 x 但是在寻找完美的数字时我们不会考虑它。我们将sum加1(或者用1初始化 - 而不是0)。
for i := 1 to x-1
for i := 2 to trunc(sqrt(x))
x
代码 if (x mod i = 0) then sum := sum + i; 为此目的可以转换为:
if (x mod i = 0) then sum := sum + i;
if (x mod i = 0) then begin sum := sum + i; sum := sum + (x div i); end;
所以我们得到以下代码:
function Perfect(x: integer): boolean; var i: integer; sum: integer = 1; sqrtx: integer; begin sqrtx := trunc(sqrt(x)); i := 2; while i <= sqrtx do begin if (x mod i = 0) then begin sum := sum + i; sum := sum + (x div i) // you can also compare i and x div i //to avoid adding the same number twice //for example when x = 4 both 2 and 4 div 2 will be added end; inc(i); end; if sum = x then exit(true) else exit(false); end;