2013-06-28 35 views
-3

我有一个生成素数的函数。内部'for循环'的迭代器如何递增?

内部的'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 
+8

您应该在调试器中逐步了解此代码的功能。 –

回答

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为它指向出。

+0

这两个if语句需要切换回来,否则如果'outer == inner',那么'outer%inner == 0'会跳闸并且不会输出。 – Cemafor

+0

以下是改进算法的两种方法。首先,您只需检查being_tested是否可以被小于或等于其平方根的整数值整除。之后的所有内容都是过度杀毒,因为您已经隐式检查了它。其次,所有大于5的素数比6的倍数要大1或小1。 – sunrize920

+0

感谢您的详细解释.. – UnhandledException

0

不管怎么说,这是一个详细的演练......在2 k开始每次都因为k声明里面的for循环。第一次运行... j = 2 k =2所以第一个如果条件得到满足。该中断将其返回到外部for循环,并将j增加为3. j = 3 k = 2 ...如果满足,则不会。 k增量... j = 3 k =3符合第一个条件,如果和中断。 j增量... j = 4 k =2。首先通过导致第二个if表达式返回true,因为4 % 2 == 0。打破循环内部并返回到外部循环。 j增量为5.运行内部循环,直到k增加为5,并且第一个if条件验证为真。如果j是偶数并且将在循环的第一次迭代中这样做,则第二个if条件仅验证为真

+0

这将通过增加'j'来产生最多'i',并检查是否有小于'j'的数字是因素。 – Cemafor

0

当中断被计入时,它将跳出内循环并在循环之后继续。内部循环是外部循环中唯一的内容,因此外部循环的下一次迭代被执行。这增加了j。当再次执行内循环时,k被设置回2,循环再次启动。之前的值k(来自以前的外循环迭代)丢失。

本身由j生成素数计数,然后检查每个数字小于其(的k值),以查看是否j % k == 0(不是素数,k是j的因子)或j == k(无迄今为止发现因子的功能所以j必须是素数)。

内环本身technicly循环到i,但是当k达到j循环被打破了,这样k将只能达到ij也等于i