我被要求写一个方法来显示前六个Mersenne素数。我当然知道出了什么问题,但我就是搞不明白。我有这样的代码,它不显示任何内容:
public static void printMersennePrimes()
{
int p = 1;
int counter = 0;
int powTwo = 2;
boolean isPrime = true;
while(counter <= 6)
{
//determine p is a prime number or not
for (int m = 2; isPrime; m++) {
if (m * m > p) {
isPrime = true;
break;
}
if (p % m == 0) {
isPrime = false;
}
}
//if p is a prime number, test if it equals 2^n-1
if (isPrime) {
while(powTwo <= p + 1) {
powTwo *= 2;
if(powTwo == p + 1) {
System.out.println(p);
counter++;
}
}
}
p++;
powTwo = 2;
}
}如果有人能帮我解释我的问题,我会很感激的.
发布于 2015-12-04 03:11:34
你有两个问题。第一种是break在for循环中将isPrime设置为true后建议的可怕的袋鼠。
第二个问题是,您从未将isPrime重置为true。一旦找到一个非素数,就不会执行对循环的素数检查,因为isPrime总是false。将isPrime = true;作为外部while循环的第一行代码,这应该可以做到这一点。
最后一件事。因为你从counter在0开始,然后去<= 6,你实际上打印了7个素数,而不是6个。把< 6或<= 5改为。
发布于 2015-12-04 05:48:00
Java的Stream使这类任务的代码更加清晰:
public static void main(String[] args) {
IntStream.iterate(1, i -> i + 1) // For all integers
.map(i -> (int) Math.pow(2, i) - 1) // get the Mersenne style ones
.filter(i -> IntStream.range(2, i).noneMatch(n -> i % n == 0)) // filter the primes
.limit(6) // limit to the first 6
.forEach(System.out::println); // print them
}https://stackoverflow.com/questions/34079973
复制相似问题