【问题标题】:Trying to find the 10,001st prime number in Java (Project Euler)试图在 Java 中找到第 10,001 个素数(Project Euler)
【发布时间】:2015-03-03 06:33:58
【问题描述】:

我是一名 java 学生,我刚开始使用 project euler 来练习代码编写和一般的打字。我目前卡在第 7 个问题上,找不到我的代码有什么问题。

     public static void main(String[] args)
     {
      int num, remainder, divisor;
      boolean working = true;
      num = 2;

     for(int count = 0; count <= 10001; count++)
     {

      divisor = num - 1;
      remainder = 1;
      working = true;

      while(working != true)
      {
         remainder = 1;
         divisor = num - 1;

         while(remainder!=0)
         {
            remainder = num%divisor;

            if(divisor==1);
            {working = false;}

            divisor--;
          }
         num = num++;
      }
     }
     //System.out.println(num -1);
    }

我得到的输出是 1,我不知道为什么。我对编码很陌生,所以如果我的代码不好且效率低下,请不要对我的代码发狂。

【问题讨论】:

  • 离题了,但是检查素数的方式效率极低。第一,n 高度不能被 n-1 整除。第二,您不需要检查偶数除数。第三,你甚至不需要检查从 1 到 n-1 的所有除数,只需要从 1 到 sqrt(n) 就足够了
  • 我曾经做过这样的事情。如果你坚持你已经找到的素数,你只需要检查这些。

标签: java primes


【解决方案1】:

以下是导致代码中出现意外结果的原因。

    if(divisor==1);
    {working = false;} // Note: {...} is a statement block and statement
                       // blocks do not need a terminating semicolon, this
                       // can be problematic because no syntax errors will
                       // occur

改为:

    if(divisor==1) {
        working = false;
    }

if 语句末尾的分号导致条件为空语句。

空洞的陈述

空语句什么都不做。

EmptyStatement:
    ;

空语句的执行总是正常完成

更多信息可以在这里找到:Semicolon at end of if statement.

【讨论】:

    【解决方案2】:

    Euler 的目的是编写尽可能快地执行的代码。如果我没记错的话,你的代码应该不到一分钟就能找到答案。

    话虽如此,应该知道偶数(除了2)不是素数。因此,您已经可以对从 1 开始的素数进行连续计数,并在每次确定素数时递增。然后你有另一个从 3 开始的计数,这个计数你必须执行检查以查看它是否为素数,如果为真则增加你的素数。无论如何,如果这个数字是素数,你会希望这个数字增加 2。

    你应该有一个控制循环,直到你的素数达到 10001

    在代码中没有给你一个直接的答案,这里有一些伪代码可以帮助你:

    int primeCounter = 1;
    int number = 3;
    
    while (primeCounter < 10001)
    {
        if (number is prime)
        {
            primeCounter++;
        }
    
        // Increment by 2, because we're only going to check odd numbers for prime
        number += 2;
    }
    
    // This will be your 10001st prime number
    output number 
    

    【讨论】:

      【解决方案3】:

      您可以使用这些事实:

      1. 1 不是素数。
      2. 除 2 之外的所有素数都是奇数。
      3. 所有大于 3 的素数都可以写成 6k+/-1 的形式。
      4. 任何数 n 只能有一个大于 n 的素数因子。 http://www.millersville.edu/~bikenaga/number-theory/primes/primes.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        • 2013-04-14
        相关资源
        最近更新 更多