我有一个生成素数的函数。
内部'for-loop'有两个条件检查语句,最终导致内部'for-loop'的破坏。
因此,在内部for循环中断之后,控制转移到外部for循环,并且再次遇到内部for循环,并且内部for循环以递增的值k
开始执行。
当值增加时,它会在if
的指定条件下中断执行?
有人会在函数内解释这段代码的工作吗?
public void prime()
{
int i = 5;
for (int j = 2; j <= i; j++)
{
for (int k = 2; k <= i; k++)
{
if (j == k)
{
Console.WriteLine(j);
break;
}
else if (j % k == 0)
{
break;
}
}
}
}
输出:
2
3
5
答案 0 :(得分:0)
无论如何,这是一个详细的演练... k
每次从2开始,因为{for循环中声明了k
。首先运行... j = 2 k =2
所以第一个if条件得到满足。中断将其返回到外部for循环,并将j
递增到3. j = 3 k = 2
...如果满足则不会。 k个增量... j = 3 k =3
符合第一个if和break的条件。 j
递增... j = 4 k =2
。第一次传递导致第二个if表达式返回true,因为4 % 2 == 0
。打破内部for循环并返回外部循环。 j
递增到5.运行内部循环,直到k
递增到5并且第一个if条件验证为true。如果j
是偶数,则第二个if条件仅验证为true,并且将在循环的第一次迭代中执行此操作
答案 1 :(得分:0)
当中断时,它会突破内部循环并在循环后继续。内部循环是外部循环中唯一的东西,因此执行外部循环的下一次迭代。这会增加j
。再次执行内循环时,k
将重新设置为2
并再次启动循环。 <{1}}的前一个值(来自外部循环的上一次迭代)将丢失。
函数本身通过k
计数生成素数,然后检查每个数字(j
的值)以查看是否k
(不是素数,k是因子) j)或j % k == 0
(到目前为止没有找到因子,所以j必须是素数)。
内部循环本身技术上循环到j == k
,但当i
到达k
时,循环被打破,因此j
只会到k
时i
也等于j
。
答案 2 :(得分:0)
这是一种蛮力方法,它测试2 .. limit
中所有前一个数字(再次来自2 .. current
)搜索倍数的所有数字,如果找到倍数则数字不是素数号。
我在代码中添加了一些注释,以便更容易理解:
public void prime () {
int limit = 5;
/**
* Starting at 2, assuming the first prime number is 2
* Test all numbers against any number from 2, if the
* number being tested is a multiple of some other
* previous number, that number is NOT a prime
*/
for (int being_tested = 2; being_tested <= limit; being_tested++) {
for (int previous_value = 2; previous_value <= limit; previous_value++) {
/**
* If previous_value == being_tested then
* no multiples have been found
* thus "being_tested" is a prime number
*/
if (being_tested == previous_value) {
Console.WriteLine(being_tested);
break;
}
/**
* If modulus == 0 then "being_tested"
* is a multiple of previous_value,
* therefore, not a prime number
*/
else if (being_tested % previous_value == 0) {
break;
}
}
}
}
注意:我发布的原始代码的条件已经反转,并且无法按预期运行,这要归功于@Cemafor指出它。