【问题标题】:Delphi - Get Number of dividable numbers [closed]Delphi - 获取可除数的数量[关闭]
【发布时间】:2014-05-20 21:45:01
【问题描述】:

我喜欢得到我的目标可以分割的数字数量。 所以如果是 10,它应该返回 4,因为 10 可以被 1、2、5 和 10 整除。 我的尝试是这样,但它返回 1?哎哟

function FindeTeiler(Zahl : Integer) : Integer;
var
Amount, i: Integer;
begin
  Amount := 0;
   For i := 1 to Zahl do begin
      If (i mod zahl = 0) then
      begin
        Amount := Amount +1;
      end;
   end;
   Result := Amount;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage('The number ' + Edit1.text + ' has ' + IntToStr(FindeTeiler(StrToInt(Edit1.text))) + ' dividers.');
end;

【问题讨论】:

  • "所以在 10 的情况下它应该返回 10"。你的意思是“它应该返回 4”?另外,我认为您的mod 声明倒退了...尝试if (zahl mod 1) = 0) then
  • 编辑:已解决,它的工作原理如下:puu.sh/8Upz9/e0e17ee635.png
  • 如果您自己解决了问题,则不应发布代码图像。只回答你自己的问题。顺便说一句,if ... then 中的布尔表达式不需要任何括号。

标签: delphi math numbers pascal divide


【解决方案1】:

您需要计算 zahl/i 的余数,但您的代码会计算 i/zahl 的余数。

所以,而不是

i mod zahl = 0 

你需要测试

zahl mod i = 0

函数应该这样写:

function FindeTeiler(Zahl: Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 1 to Zahl do
    if zahl mod i = 0 then
      inc(Result);
end;

【讨论】:

  • 我想我会在这里为 zahl 使用无符号类型。整数不知何故意味着当你输入一个负数时会发生一些有用的事情。
  • 为了优化该功能,我将从Result := 2; 开始并从2 to Abs( zahl div 2 ) 迭代
  • 其实如果Zahl很大,从2迭代到Ceil(Sqrt(Zahl))就够了。
  • @SirRufo 您的优化需要满足 Zahl = 1 的需求。
  • @DavidHeffernan 哦,他妈的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2015-10-06
相关资源
最近更新 更多