我一直在做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
”部分令我感到困惑。
答案 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=5
和num=100
第二次迭代将是i=25
和num=100
第三次迭代将是i=125
和num=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
此时你的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次。