【问题标题】:Printing numbers divisible by 2 but not 3?打印可被 2 整除但不能被 3 整除的数字?
【发布时间】:2014-09-23 02:01:15
【问题描述】:
for (int i=n1; i < n2; i++){
    if (i % 2 == 0){
        System.out.println(i);
    }
}

此代码打印出 n1 和 n2 之间的所有数字(随机生成),它们都可以被 2 和 3 整除,但我只想打印出可以被 2 整除的数字。我该怎么做?

【问题讨论】:

  • @SotiriosDelimanolis:嗯...30...
  • 您知道&amp;&amp;! 运算符吗?
  • 3 或 9 不会被打印出来。它只打印能被 2 整除的数字!
  • 尝试使用 && 和 ! @Mephy 提到的运算符。

标签: java if-statement


【解决方案1】:

你已经成功了一半。

您需要第二个条件,即您要求该数字不能被 3 整除。它看起来像这样:

!(i % 3 == 0)

现在,您需要一个布尔运算符,仅当两个条件都为真时才返回真。那,我将作为练习留给读者。

【讨论】:

    【解决方案2】:

    (其他人已经给出了正确答案,但我会尝试更自然地解释一下)

    对于计算机,您需要以他们可以理解的方式写一个句子。您需要将诸如“除以 2 但不除以 3”之类的逻辑句子转换为更基本的版本,仅使用“非”、“与”和“或”这些词。在您的具体情况下,您想说the numbers that are divisible by 2 AND NOT divisible by 3

    正如您已经注意到的,N%X!=0 是一种(丑陋的)写 N is divisible by X 的方式。在 Java 中,我们使用! 表示not,使用&amp;&amp; 表示and

    这样,(N is divisible by 2) AND NOT (N is divisible by 3) 可以写成(N % 2 == 0) &amp;&amp; !(N % 3 == 0)。但是我们也有X not equal Y操作符(X!=Y),它相当于NOT (X equal Y)但更容易理解,导致代码如下:

    if ((i % 2 == 0) && (i % 3 != 0)) {
        System.out.println(i);
    }
    

    【讨论】:

      【解决方案3】:

      我使用位运算符来获得最佳性能(如果(i &amp; 1) == 0i偶数)。因为二进制中的偶数总是以0位结尾。

      public class Example {
      
          public static void main(String[] args) {
              int n1 = 0;
              int n2 = 100;
              for (int i = n1; i < n2; i++) {
                  if (((i & 1) == 0)) {
                      if (i % 3 != 0) {
                          System.out.print(i + " ");
                      }
                  }
              }
          }
      }
      
      //    Result:
      //        2 4 8 10 14 16 20 22 26 28 32 34 38 40 44 46 50 52 56 58 62 64 68 70 74 76 80 82 86 88 92 94 98 
      

      还有更好的方法,例如 3534 % 3 == 0,我们有:所有数字的总和 (3 + 5 + 3 + 4) = 15 和 15 % 3 == 0... .

      当 n 很大时,例如 n2 = 99999999999999 ,使用所有数字的总和为 (9+9+9+9+9+9+9+9+9+9+9+9+9+9) % 3 == 0,和位操作符很有意义:)

      【讨论】:

        【解决方案4】:

        更有效的解决方案是打印不是 3 的倍数的偶数(每秒),(每隔三个数字)

        for (int i = 2; i < n; i += 6) {
             System.out.println(i);
             if (i + 2 < n)
                 System.out.println(i + 2);
        }
        

        取模操作很昂贵,这将在每个循环中打印两个数字,而不是每六个循环打印两个数字。

        【讨论】:

        • 我比较喜欢这个解决方案。但是如果 n 是奇数会发生什么?例如。让n = 3。循环不会触发,因为条件不成立。
        • @Makoto 好点,有时它会无法打印出最后一个数字。
        【解决方案5】:

        使用逻辑和比较运算符&amp;&amp;

        for (int i=n1; i < n2; i++){
            if (i % 2 == 0 && i % 3 != 0) {
                System.out.println(i);
            }
        }
        

        您的if 条件现在询问“i 是否可以被 2 整除并且不能被 3 整除”

        【讨论】:

          猜你喜欢
          • 2021-01-09
          • 2019-07-21
          • 2018-04-10
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 2019-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多