【问题标题】:Prime Number function only printing 2 and 3质数功能仅打印 2 和 3
【发布时间】:2013-08-06 09:19:09
【问题描述】:
package PrimeNum;

public class primeNum {
public static void main(String args[]){
    int flag = 0;
    /*
    for(int i = 2; i <= 100; i++){
        if(i % 2 != 0 && i % 3 != 0 && i % 4 != 0 && i % 5 != 0 && 
                i % 6 != 0 &&  i % 7 != 0 && i % 8 != 0 && i % 9 != 0 && i % 10 != 0 ){
            System.out.print(i + " ");
        }
    }
    */
    System.out.println();

    for(int i = 2; i <= 100; i++){

        for(int j = 2; j <= 10; j++){
            if(i % j != 0) { 
                flag++;
            }
        }

        if(flag == 9 || flag == 8){
            System.out.print(i + " ");
            flag = 0;
        }
    }
}

}

代码是使用 Java 编写的,我似乎无法找到为什么它在整个循环中只打印 2 和 3 到 100。请帮助?

【问题讨论】:

  • 你的程序应该做什么?你为什么检查flag == 9 || flag == 8?我怀疑问题是标志在 3 之后 > 9,所以你永远不会得到另一个输出。
  • 如果您不给我们SSCCE的代码,您将得不到任何答复,因为目前我们无法编译您的代码以进行检查。
  • 当值 i 不能被值 j 整除时,它会增加 flag 以指示它不能被它整除的数字的数量。由于您只需要最少的数字 2-10(9 个数字)来除以一个数字以查看它是否为素数,因此当程序意识到该数字不能被所述数字整除时,它会将其打印出来。我为小于 10 的数字包括了 8。但是,它只打印 2 和 3
  • 顺便说一句,你为什么在这里发布评论代码?

标签: java primes


【解决方案1】:

这应该可行:

package PrimeNum;

    public class primeNum {
    public static void main(String args[]){
        int flag = 0;
        System.out.println();

        for(int i = 2; i <= 100; i++){
            flag = 0;//Initialize flag to 0 here

            for(int j = 2; j <= 10; j++){
                if(i % j != 0) { 
                    flag++;
                }
            }

            if(flag == 9 || flag == 8){
                System.out.print(i + " ");
                flag = 0;
            }
        }
    }
}

求素数的正确方法

public static void main(String[] args) {
        int flag = 0;
        for (int i = 2; i <= 100; i++) {
            flag = 0;
            for (int j = 2; j <= i - 1; j++) {
                if (i % j != 0) {
                    flag++;
                }
            }

            if (flag == i - 2) {
                System.out.print(i + " ");
            }
        }
    }

【讨论】:

    【解决方案2】:

    嗯,解释起来并不难(虽然我不知道你为什么写这段代码,但绝对不是主要测试)。

    在您的内部循环中,您测试当前数字是否可被数字 2 到 10 整除(您计算不能整除 i 的数字的数量)。

    对于i=2,只有2除i,所以在内循环之后,flag = 83 .. 10)。因此,您打印2 并重置flag

    对于i=3,只有3个除法i,所以在内循环之后,flag = 824 .. 10)。因此,您打印3 并重置flag

    对于i=424i,因此在内循环之后,flag = 7。你不打印任何东西并且不重置flag

    对于 i=5,只有 5 个除法 i。由于您没有重置flag,因此在内循环之后它将是flag = 15。您将永远不会重置flag,因此您不会再打印任何数字。

    【讨论】:

    • @downvoter 需要解释一下吗? OP 询问为什么只打印 2 和 3。嗯,正是因为这个原因。
    • @Heuster 的解释是正确的,为什么投反对票?我投了赞成票。
    【解决方案3】:

    怎么样:

    public static void main(String args[]){
    
        System.out.println();
    
        for(int i = 2; i <= 100; i++){
    
            int flag = 0;
    
            for(int j = 2; j <= i; j++){
                if(i % j == 0) {
                    flag++;
                }
            }
    
            if(flag == 1){
                System.out.print(i + " ");
            }
        }
    }
    

    返回:

    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    

    【讨论】:

      【解决方案4】:

      您测试每个数字,计算除数的数字并在该数量与标准匹配时打印它的想法很好,但我会稍微颠倒测试。

      一个素数正好有两个正除数,1和这个数本身

      如果您测试 2 和 number - 1 之间的每个数字,您应该会找到 0 个除数。对于每个数字都是如此,您不必知道有多少除数不是除数,也不必测试每个数字的每个除数,25 不能是 10 的除数,因为它更大。

      public static void simplePrintPrimesUpTo(int max) {
          // test every number between 2 and max inclusive
          for (int number = 2; number <= max; number++) {
              int foundDivisors = 0;
      
              // test every divisor between 2 and 1 less than the current number
              for (int divisor = 2; divisor < number; divisor++) {
                  if (number % divisor == 0) {
                      foundDivisors++;
                  }
              }
      
              if (foundDivisors == 0)
                  System.out.print(number + " ");
          }
          System.out.println();
      }
      

      这可以进一步优化。除数的一个有趣的性质是

      n 的除数必须小于或等于 n 的平方根

      这意味着在内部循环中使用divisor &lt;= sqrt(number) 作为上限将大大减少所需的测试量。不幸的是,计算 on int 的平方根很难看,但是该公式可以在两边取平方,并且测试变得更简单。

      (divisor)^2 <= (sqrt(number))^2
      

      可以简化为

      (divisor)^2 <= number
      

      可以进行的下一个优化是在找到测试除数时跳过测试除数。有 2 个或 10 个都没有关系,如果我们找到一个,它就不是质数。结果可能是这样的

      public static void optimizedPrintPrimesUpTo(int max) {
          nextNumber:
          for (int number = 2; number <= max; number++) {
      
              for (int divisor = 2; (divisor * divisor) <= number; divisor++) {
                  if (number % divisor == 0) {
                      // skip testing this number, continue in the outer loop
                      continue nextNumber;
                  }
              }
      
              System.out.print(number + " ");
          }
          System.out.println();
      }
      

      【讨论】:

        【解决方案5】:

        这可能对你有帮助

         boolean isPrime=true;
            for(int i = 2; i <= 100; i++){
                for(int j=2; j<i; j++){
                    if(i%j == 0){
                       isPrime=false;
                    }
                }
                if(isPrime){
                    System.out.print(i+" ");
                }
                isPrime=true;
            }
        

        输出

        2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
        

        【讨论】:

        • @Aquillo 你有什么问题???谁在这里使用 String 作为布尔值???最好睁大眼睛自己运行。你在崇拜布尔吗??????
        • 当布尔值显然是这里更好的选择时,您不应该滥用字符串。我不会为此编写任何测试,但这在性能方面不会很好。
        • @Aquillo 这不值得被否决,因为这不是一个错误的答案或误导某些人
        • @Aquillo - 将字符串用于信息目的实际上对此非常有帮助,它可以清楚地说明代码中发生了什么 - 我为此投了赞成票!
        • 我同意,在这里使用String 是不合适的。 boolean isPrime 会更好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 2014-11-29
        相关资源
        最近更新 更多