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

6 回答 6

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将在每次迭代后清除。您应该从循环内部删除该数组声明。

现在,与其在循环外添加数组声明,我建议您改用 an ArrayList,它是一个动态递增的数组。因此,您不必提供初始大小。

因此,您可以在外 for循环之外添加以下声明:

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

问题4:

让我们继续您的内部 for循环:

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

现在,忘记那个循环有什么问题,因为根本不需要那个循环。你还没有初始化你的list. 因此,迭代它是没有意义的。您宁愿需要使用指定范围之间的素数对其进行初始化。

因此,您应该测试您正在测试的当前数字,而不是使用 for 循环来迭代数组/列表,无论它是否是素数。如果它是素数,请将其添加到列表中。要测试素数,您需要为每个数字循环。我建议以单独的方法移动该逻辑。要检查一个数字是否为素数,您需要继续将它除以从2到的数字num / 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);
    }
}

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

于 2013-02-05T12:34:30.583 回答
1

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


关于代码的其他建议。

  1. 您应该对您正在接受的输入进行验证。检查相同的异常处理。例如,如果用户没有在您预期的地方输入数字,那么您的代码将中断。

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

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

于 2013-02-05T12:29:37.533 回答
1

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

for (int prime: primeList) {

短 for 循环需要迭代中使用的变量类型

于 2013-02-05T12:31:11.073 回答
1

在 java 中,数组是对象,应该使用new.

int[] PrimeList = new int[10];
于 2013-02-05T12:17:48.510 回答
-1

你必须初始化你的数组,例如:

int PrimeList[] = new int[3]
于 2013-02-05T12:17:59.113 回答
-1

我认为你还没有初始化你的变量int Prime;int PrimeList[];

将它们初始化为

int Prime = 0;
int PrimeList[] = new PrimeList[10];
于 2013-02-05T12:21:59.957 回答