2015-03-03 51 views
2

我是一名java学生,我刚开始使用project euler来让我练习代码写作并只是输入一般信息。我目前停留在第7个问题上,无法找到我的代码出了什么问题。试图找到Java中的10,001st素数(欧拉项目)

 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,我找不出原因。我对编码非常陌生,所以请不要在我的代码疯狂,如果它是糟糕和低效的LOL。

+0

题外话,但你检查素数的方法是非常低效的。 1,n很难不被n-1整除。第二,你不需要检查甚至除数。3,你甚至不需要检查从1到n-1的所有除数,只有从1到sqrt(n)就足够了 – 2015-03-03 07:54:44

+0

我做了这样一次。如果你坚持你已经找到的素数,你只需要检查这些数字。 – Jake 2015-04-06 13:58:07

回答

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.

+0

Omg我不敢相信我错过了,谢谢! – Forev3r 2015-03-03 18:37:31

0

欧拉的目的是写一个快速执行尽可能代码。如果我没有记错,那么你的代码应该少于一分钟就能找到答案。

话虽如此,应该知道偶数(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