【问题标题】:Using "mod" operator使用“mod”运算符
【发布时间】:2011-07-28 09:34:57
【问题描述】:

每当我需要在我的 for 循环中每 300 次迭代执行某个操作时,我都会尝试显示(有意义吗?)

这是我想要做的代码,但不是我想要的方式:

for I := 0 to 2000 do
  Begin
   if I = 300 then
   DoAnAction;

   if I = 600 then
   DoAnAction

   if I = 900 then
   DoAnAction

   if I = 1200 ......... Same action all over, but I don't want to check all those conditions!
  End;

所以有人告诉我使用mod 运算符,我就是这样做的:

for I := 0 to 2000 do
 Begin
  if I mod 300 = 299 then
  DoAnAction;
 End;

然而,使用上述sn-p的结果会在299、599、899 ....

如何使用 Mod 运算符使其在 300、600、900 ...... (并且做if I mod 300 = 300 没有用)

谢谢!

【问题讨论】:

  • 0 mod 300 = 300 mod 300 = 0。i mod n 在 [0..n-1] 范围内。
  • 哇,这么多答案!好吧,我想第一个得到了标记..
  • 打勾最好的,而不是最快的
  • @David - 你推荐哪一个?
  • @David - 我在这里激怒了很多人,所以我先问专家。

标签: delphi math integer modulo


【解决方案1】:

mod 运算符返回除法的其余部分。因此,如果您想每 300 次迭代执行一次,请使用 i mod 300 = 0

I mod 300 = 300 没有意义,因为不能除以 300 剩下 300。

【讨论】:

    【解决方案2】:
    for I := 0 to 2000 do
     Begin
      if (I mod 300 = 0) and (I > 0) then
        DoAnAction;
     End;
    

    虽然你以前的版本也很有意义,但 I=299 是第 300 次 ;)

    编辑:I mod 300 = 300 不起作用,因为 mod 运算符返回 devision 的剩余部分,根据定义,这将在0..299 范围内

    【讨论】:

    • 不是有传言说使用and运算符时返回false的可能性最高的条件检查应该先检查吗?在这个 sn-p 中,I > 0 几乎每次都为真。当然,在这种情况下这并不重要,因为检查它不会花费很长时间,但是我又一次无意中听到了。如果我错了,请纠正我。 :)
    • 我没有想到这样的优化,当然交换支票会更有意义。我应该编辑我的答案吗? :)
    • @Krom - 好吧,我得到了我需要的东西,但如果其他人发现使用这个问题,这可能是个好主意。 :)
    • @Jeff:如果您担心优化级别,请不要担心。相反,将您的循环更改为从1 to 2000 运行,并且当计数器为0 时它永远无法运行。
    • @Ken - 我并不担心,只是想确保我真的是对的:P
    【解决方案3】:

    使用这个:

    if i mod 300 = 0
    

    模运算符返回除法的余数。

    这里有一个例子可以帮助你。将 TMemo 放在一个空白的新表单上,并将其放入 FormCreate evemt:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
    const
      Output = 'i mod %d = %d';
    begin
      Memo1.Clear;
      for i := 0 to 10 do
        Memo1.Lines.Add(Format(Output, [i, i mod 5]));
    end;
    

    运行它,然后查看备忘录中的输出。

    【讨论】:

      【解决方案4】:

      试试(I <> 0) AND ((I mod 300) = 0)

      【讨论】:

      • mod 返回除法的其余部分。 x 不能除以 x 的其余部分。
      【解决方案5】:

      procedure TForm1.Button1Click(Sender: TObject); var i:REal; begin i:=strtofloat(edit1.Text); if i mod 5 = 0 then begin label1.Caption:='Кратно 5'; end else begin label1.Caption:='Не кратно 5'; end; end;

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多