对于循环限制无尽但仍然有效

时间:2017-08-03 17:19:31

标签: java

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

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”部分令我感到困惑。

7 个答案:

答案 0 :(得分: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 :(得分: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

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

答案 2 :(得分:1)

此条件指示循环继续,直到num/i变为一个或更少。这只是一个布尔条件,可能是true或false。一旦条件变为假,循环就会停止。

由于i变为前一次迭代期间的五倍,因此循环有效地将除以5除以k+1的幂,其中k是迭代次数。

您可以通过将两边乘以i来重写此内容:

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

答案 3 :(得分: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&gt; = 20是一个评估为true或false的条件。唯一棘手的问题是条件中有一个表达式(num/i),而不是一个数字。

答案 4 :(得分:0)

num/i>=1表示只要此语句为真,就会执行循环,因此只要num除以i的结果更大

问题是,i是你的循环变量,因此每次循环执行时它都会增长。因此num/i会变小,直到最终小于1.

示例:Num = 50

  1. 循环:50/5&gt; = 1? - &GT;真
  2. 循环:50/25&gt; = 1? - &GT;真
  3. 环:50 /> = 1?25 - >假
  4. 此时你的Loop会停止。

答案 5 :(得分: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(它是整数)。

答案 6 :(得分: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

在第三次迭代中,条件失败,因为100/125不是> = 1。

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