2013-02-05 104 views
0
//Prime Number Calculator 

import java.util.Scanner; 

class PrimeNumbers { 
    public static void main(String[] args){ 
     int End; 
     int Begin; 

     Scanner in = new Scanner(System.in); 

     //insert max value for the calculator. 
     System.out.println("Where should I stop?"); 
     End = in.nextInt(); 

     for (Begin=3; Begin<=End; Begin++){ 
      System.out.println(Begin); 
      int Prime; 
      int PrimeList[] ; 

      //something is wrong around here... I don't understand what... 

      for (Prime:PrimeList); 
       PrimeList[0]=2; 
      if(Begin%PrimeList[Prime]!=0){ 
       break; 
      } 
     } 
    }  
} 

我知道有很多素数计算器在那里,但对于我想做的一个学校,但我不知道我错在哪里。这个数组有什么问题

错误消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Syntax error on token "Prime", Identifier expected after this token 
Prime cannot be resolved to a type 
Type mismatch: cannot convert from element type int to Prime 

at PrimeNumbers.main(PrimeNumbers.java:25) 
+0

你想做什么?什么是PrimeList? –

+3

定义你的意思是“有问题”:编译?如果不是,它会给出什么错误信息?它运行吗?如果没有,它会给出什么错误信息?它产生你想要的东西吗?如果不是,它会产生什么*它会产生什么,你期望它产生什么。 –

+0

你是什么意思'有问题'。如果您遇到错误,请发布。如果你得到了错误的结果,请发表。等帮助我们帮你 – Nanne

回答

1

在java中,Arrays是对象,并且应该使用new被初始化。

int[] PrimeList = new int[10]; 
+1

按照惯例,所有Java类成员和变量都以小写字母开头。因为否则你没有看到类和成员/变量之间的区别。 – fonZ

+0

这是你投票失败的原因吗? – Azodious

+0

和我下面说的一样。改变它,我会投票。 – fonZ

-1

你必须initate你的阵列,例如:

int PrimeList[] = new int[3] 
+0

按照惯例,所有的Java类成员和变量都以小写字母开头。因为否则你没有看到类和成员/变量之间的区别。 – fonZ

+0

很抱歉,但我认为我们不同意这件事,请检查Rohit Jain给出的答案以及我的评论。 – fonZ

+0

我没有乐趣downvoting,它激怒了我,当我看到人们重复明显的错误。在我看来,经验丰富的程序员应该知道的错误。 – fonZ

-1

我想你还没有intialize双方的变量int Prime;int PrimeList[];

初始化它们作为

int Prime = 0; 
int PrimeList[] = new PrimeList[10]; 
1

正如其他人所说,你还没有初始化你的PrimeList阵列。


关于代码的其他建议。

  1. 您应对输入的内容进行验证。检查Exception handling为相同。例如,如果用户没有输入一个你所期望的数字,那么你的代码就会中断。

  2. 变量名不是一个java豆规范格式即第一字母应该是小瓶盖,然后应遵循驼峰符号这是capitaize每一个字的第一个字母的变量名。

  3. 算法似乎是完全错误的。 PrimeList没有被填充到任何地方,除非你在一个单独的代码中生成了它们,并没有将它集成到上面给出的代码中。

1

您的for循环中有语法错误。它应该是

for (int prime: primeList) { 

短的循环需要迭代

4

好使用的变量的类型,那么你的代码已经有一对夫妇的问题(好吧,可能更多),我将在此列出:

问题1:

首先。始终遵循Java命名约定。您的变量名称和方法名称应以小写字母开头。所以:

int End; // Should be `int end;` 
int Begin; // Should be `int begin;` 

问题2:

你刚才宣布的数组引用,而不是初始化它。下面的声明就宣布int类型的数组引用:

int PrimeList[] ; 

你需要创建一个数组对象,并指定参考吧:

int PrimeList[] = new int[size]; 

问题3:

此问题是对问题2的扩展。请注意,您正在循环的每次迭代中初始化一个新数组。所以,你所有的素数都不会在同一个地方积累。相反,您的array将在每次迭代后清除。您应该从循环中删除该数组声明。

现在,我不建议在循环外部添加数组声明,而是建议您使用ArrayList,而不是使用动态增加的数组。所以,你不需要给出初始大小。

所以,你可以添加for外循环以下声明:

List<Integer> primeList = new ArrayList<Integer>(); 

问题4:

让我们向前迈进,以您的for循环:

for (Prime:PrimeList); 
    PrimeList[0]=2; 
    if(Begin % PrimeList[Prime] != 0){ 
     break; 
    } 
} 

现在,只需忘记该循环出了什么问题,因为该循环根本不需要。您尚未初始化您的list。所以,迭代它没有意义。您需要使用指定范围内的素数初始化它。

因此,您应该测试您正在测试的当前编号,而不是使用for循环来迭代数组/列表。如果它是素数,请将其添加到列表中。为了测试素数,你需要每个数字的循环。我建议以单独的方法移动该逻辑。要检查数字是否为素数,请继续将数字除以2num/2。而一旦你看到modulus = 0return false其他return true: -

public boolean isPrime(int num) { 
    for (int i = 2; i <= num/2; i++) { 
     if (num % i == 0) return false; 
    } 
    return true; 
} 

现在,让我们回到你原来的方法。并看看你的外部循环:

for (begin=3; begin <= end; begin++) { 
    /** For each number, check whether it's prime or not **/ 
    if (isPrime(begin)) { 
     /** Is Prime, add it to list **/ 
     primeList.add(begin); 
    } 
} 

这就是它。现在,我建议你逐步完成答案,逐个解决每个问题。

+0

这就是为什么我投下了其他答案,因为我在等待有人给出了一个体面的答案,没有像这样重复的错误。 – fonZ