这是Delphi中的代码:
function Perfect(x: Integer): Integer;
var
i, a: Integer;
begin
i := 1;
a := 0;
while i <= x div 2 do
begin
if (x mod i = 0) then
a := a + i;
i := i + 1;
end;
if x = a then
Result := x;
end;
基本上,它是一个从给定间隔显示perfect numbers的函数。我创建了一个循环来显示这些数字,但我有一个问题,因为当它不是一个完美的数字时它也会显示一些随机数。所以,假设我有[1; 7]然后控制台显示:
1969410929
1969410929
1969410929
1969410929
1969410929
6
1969410929
我该怎么做才能显示正确的数字?
答案 0 :(得分:4)
如果数字不完美,您的代码无法设置返回值。在那种情况下,返回的值定义不正确。您必须始终设置返回值。来自documentation:
如果函数退出而没有为Result或函数名赋值,则函数的返回值是未定义的。
由于函数必须返回一个值,因此您的函数处于绑定状态。如果值不完美,该返回什么?我认为没有好的选择。您不需要返回该号码,因为您已经知道它。毕竟你把它传递给了这个函数。
因此,您应该更改函数的设计以返回一个布尔值,指示数字是否完美:
function IsPerfect(x: Integer): Boolean;
var
i, sum: Integer;
begin
sum := 0;
for i := 1 to x div 2 do
if x mod i = 0 then
inc(sum, i);
Result := x = sum;
end;
调用函数的代码运行如下:
for i := 1 to 1000 do
if IsPerfect(i) then
Writeln(i);
<强>输出强>
6 28 496
答案 1 :(得分:2)
...&#34;当它不是一个完美的数字时,它也显示一些随机数字&#34;。
原因是您没有设置Result
&#34;变量&#34;当它不是一个完美的数字。如果您创建的函数未在所有情况下设置Result
变量,则在这些情况下调用它的结果将是未定义的。随机描述它,虽然它可能是某种系统,即使系统只是&#34;内存中放置了Result
变量的任何内容&#34;。
如果它不是一个完美的数字,您需要确定要返回的内容,并进行以下任一代码更改:
Result := <what to return if not?>;
if x = a then
Result := x;
或者这个:
if x = a then
Result := x
else
Result := <what to return if not?>;