2017-08-03 73 views
0

我一直在做Java很长的时间,我偶然发现了这段代码。我不明白它是如何工作的:For循环限制无限但仍然工作

int func(int num){ 
    int counter=0; 
    for(int i=5;num/i>=1;i=i*5) 
     counter=counter+num/i; 
    return counter; 
} 

此功能是计算尾随零的阶乘数量计划的一部分。我不明白的是for循环部分。限制通常是第二个条件,在这里是“num/i>=1”。

我不明白,如果i采取num作为100,限制将是100/5 = 20?但部分“>=1”令我困惑。

+0

所以20> = 1所以它循环 – epascarello

+1

你以前没见过'> ='运算符?我无法想象你已经在Java工作很长时间了...... – David

+0

你有没有试过在纸上执行它?它可以真正帮助你看到这样的代码块。 – litelite

回答

3

在java for循环中,没有限制。你可能会想到BASIC。

在java for循环中,第二个表达式是终止表达式。只要终止表达式为true,循环将保持循环。 (这就是为什么我宁愿把它看作延续表达式,但不介意我。)当然,这个表达式必须估计为boolean

100/5将作为终止表达式是非法的,因为它的类型为int,而不是boolean

100/5 >= 1是合法终止表达。只要num/i大于或等于1,循环将重复。

有关Java for环的更多信息:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html

1

该条件指示循环继续直到num/i达到1以下。这只是一个布尔条件,可能是真或假。一旦条件变为假,循环停止。

由于i变成比前一次迭代期间大五倍,所以该循环有效地除以5的功率为k+1,其中k是迭代次数。

您可以通过i两边乘以改写这个:

for (int i=5 ; num >= i ; i=i*5) { 
    counter += num/i; 
} 
+0

喜欢此答案!非常感谢! – AxeManTOBO

1

num/i>=1是,事实上,一个条件。

让我们看几个例子

num = 100; i = 5; 
num/i >= 1; // true because 100/5 is greater than 1 
num = 100; i = 200; 
num/i >= 1; // false because 100/200 is not greater than 1. 

正如你所看到的,NUM/I> = 20计算结果为真或假的条件。唯一棘手的是,在条件下有一个表达式(num/i),而不是一个单一的数字。

0

num/i>=1意味着你的循环将只要这个说法是正确的执行,所以只要NUM的结果除以我北京时间更大

的事情是,i是你的循环变量,所以它会每次循环执行时都会增长。所以num/i会越来越小,直到最后大于1

小。例如:民= 50

  1. 循环:50/5> = 1? - > True
  2. Loop:50/25> = 1? - >真
  3. 循环:50 /> = 1 25 - >假

此时你的循环将停止?

0

好吧,让我们举一个简单的例子。 下面是代码:

public class Fact { 

    public static void main(String[] args) { 
     new Fact().func(98); 
    } 

    int func(int num) { 
     int counter = 0; 
     for (int i = 5; num/i >= 1; i = i * 5) { 
      System.out.println("num: "+num + "/" + i + " = " + num/i); 
      counter = counter + num/i; 
      System.out.println("Counter = " + counter); 
     } 
     return counter; 
    } 
} 

这里是输出的98.

run: 
num: 98/5 = 19 
Counter = 19 
num: 98/25 = 3 
Counter = 22 
BUILD SUCCESSFUL (total time: 0 seconds) 

的例子所发生的是:NUM i被用于第一循环步骤,以评估98/5号/ = 19.6,但它是四舍五入由java到19(它是整数)。

0

num/i>=1是一种病症。你如何得出结论20(100/5 = 20)将会限制循环。分母i由每个循环中i的因子更新并检查条件。因此,对于输入NUM = 100这如何环路将处理

首先

for(i=5; 100/5>=1; i=25) condition is true

for(i=25; 100/25>=1; i=125) condition is true

在第三次迭代条件失败,因为一百二十五分之百不是> = 1 。

100有2个零和循环迭代2次。

2

你的环是等效(更多或更少),以这样的:

int func(int num){ 
    int counter=0; 
    for(int i=5; i<=num;i=i*5) 
    counter=counter+num/i; 
    return counter; 
} 

对于其中num = 100

在第一次迭代将是一个壳体i=5num=100

在第二次迭代将i=25num=100

第三次迭代将在这种情况下,环的存在是因为条件(num/i >= 1 [这相当于] i<=num)不再满足i=125num=100(编辑:在这种情况下,以防万一num/i = 0