这个数组有什么问题

时间:2013-02-05 12:14:16

标签: java arrays

//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)

6 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分:1)

在java中,Arrays是对象,应使用new进行初始化。

int[] PrimeList = new int[10];

答案 2 :(得分:1)

正如其他人所述,您尚未初始化PrimeList数组。


有关代码的其他建议。

  1. 您应该对正在进行的输入进行验证。检查Exception handling是否相同。例如,如果用户没有输入您预期的数字,那么您的代码就会中断。

  2. 变量名称不是java-bean规范格式,即第一个字母应该是小写的,然后应该遵循 camelCase 表示法,这将表示每个下一个字母的第一个字母变量名中的单词。

  3. 算法似乎完全错了。 PrimeList不会在任何地方填充,除非您已在单独的代码中生成它们,并且未将其集成到上面给出的代码中。

答案 3 :(得分:1)

for循环中存在语法错误。它应该是

for (int prime: primeList) {

循环的简称需要迭代中使用的变量类型

答案 4 :(得分:-1)

您必须启动数组,例如:

int PrimeList[] = new int[3]

答案 5 :(得分:-1)

我认为您尚未初始化变量int Prime;int PrimeList[];

将它们初始化为

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