使用一种方法打印素数

Dav*_*ell 1 java

我正在尝试创建一个void方法,将素数打印到给定的int参数.这就是我所拥有的,它不起作用.

public class listPrimes {
    public static void main(String[] args) {
        printPrimes(1000);

    }

static void printPrimes(int max) {
    int counter = 0;
    for (int i = 2; i <= max; i++) {
        for (int n = 2; n < i; n++) {
            if (i % n == 0) {
                counter++;
            }
        }
        if (counter == 0) {
            System.out.println(i);
            counter = 0;
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我能够使用下面的两种方法创建所需的效果,但我想用一个方法来做.我的代码上面有什么问题?

public class listPrimes {
    public static void main(String[] args) {
        printPrimes(1000);
    }

private static void printPrimes(int max) {
    for (int i = 2; i <= max; i++) {
        if (primeCheck(i)) {
            System.out.println(i);
        }
    }
}

static boolean isPrime(int check) {
    for (int i = 2; i < check/2; i++) {
        if (check % i == 0) {
            return false;
        }
    }
    return true;
}
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 6

你永远不会重置价值counterouter loop.所以,一旦它增加,它永远不会是0.所以,只需counter在外循环的开头重置: -

for (int i = 2; i <= max; i++) {
    counter = 0;
    for (int n = 2; n < i; n++) {
        if (i % n == 0) {
            counter++;
        }
    }
    if (counter == 0) {
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我更愿意采用第二种方式,因为它以不同的方法划分了任务.因此,这两种方法都有自己定义的角色.你可以轻松地在其他地方使用它们.请记住,您在不同方法之间划分的任务越多,您获得的可重用性就越高.让一个方法只做一个任务总是更好.

另外,我建议重命名的方法- primeCheckisPrime,因为它返回一个boolean值.所以,只是遵循命名惯例,isPrime将是一个好名字.