我一直在为我的介绍性Java类工作这个程序,基本上,它应该提示用户选择是否显示素数(1-1000),mersenne素数(1-10000)的菜单),或费马素数(1-1000)。我终于让它运行但是当我选择3或4(显示mersenne或fermat)时,没有任何显示,但程序仍在运行。对于Mersenne Prime,它应显示数字3,7,31,127和8191.对于Fermat Prime,它应显示数字3,5,17,257。
我尝试在我的MyMath程序中重新排序算法,但仍然没有输出。
这里是算法的MyMath程序:
public class MyMath
{
public static boolean isPrime (long number)
{
boolean prime = true;
int counter = 2;
if (number <= 1)
{
prime = false;
}
else if (number == 2)
prime = true;
else
{
while (counter <= Math.sqrt(number))
{
if (number % counter == 0)
prime = false;
counter++;
}
}
return prime;
}
public static boolean isMersennePrime (long number)
{
boolean mersenne = false;
if (isPrime(number))
{
mersenne = true;
while (number <= (long)(Math.pow(2, number)) - 1);
{
number++;
}
}
return mersenne;
}
public static boolean isFermatPrime (long number)
{
boolean fermat = false;
if (isPrime(number))
{
fermat = true;
while (number <= (long)(Math.pow(2, Math.pow(2, number))) - 1);
{
number++;
}
}
return fermat;
}
}
这是MyMathTest程序,它假设从MyMath调用方法来显示数字:
import javax.swing.JOptionPane;
public class MyMathTest
{
public static void main(String[] args)
{
// create menu
String menuChoice = "1: Display the Prime Numbers 1 - 1000\n" +
"2: Display the Mersenne Prime Numbers 1 - 10,000\n" +
"3: Display the Fermat Primes 1 - 1000\n" +
"4: Quit\n";
int userInput = 0;
// begin do while loop
do
{
// display menu and prompt for input
String numberChoice = JOptionPane.showInputDialog(null, menuChoice);
userInput = Integer.parseInt(numberChoice);
// begin switch statement for choices
switch (userInput)
{
// case 1 displays prime number 1 to 1000
case 1:
String displayPrime = "The Prime Numbers from 1 through 1,000:\n";
int outputLine = 1;
for (int prime = 1; prime <= 1000; ++prime)
{
if (MyMath.isPrime(prime)) // call isPrime method
{
displayPrime += String.format ("%d ", prime);
if (outputLine == 10)
{
displayPrime += " \n";
outputLine = 0;
}
++outputLine;
}
}
// display in dialog box
JOptionPane.showMessageDialog(null, displayPrime);
break;
case 2:
String displayMersenne = "The Mersenne Prime Numbers from 1 through 10,000:\n";
for (int mersenne = 1; mersenne <= 10000; mersenne++)
{
if (MyMath.isMersennePrime(mersenne))
{
displayMersenne += String.format ("%d ", mersenne);
}
}
JOptionPane.showMessageDialog(null, displayMersenne);
break;
case 3:
String displayFermat = "The Fermat Prime Numbers from 1 through 1,000:\n";
for (int fermat = 1; fermat <= 1000; fermat++)
{
if (MyMath.isFermatPrime(fermat))
{
displayFermat += String.format ("%d ", fermat);
}
}
JOptionPane.showMessageDialog(null, displayFermat);
break;
case 4:
break;
default:
} // end switch
} while (userInput != 4);
} // end main
} // end class MyMathTest
答案 0 :(得分:1)
你的while
中有一些拼写错误。你不应该';'在你的条件和开始循环代码的{
之间。
除此之外,你将你的计数器和逻辑中的输入数字混合起来计算Mersenne和Fermat素数,所以你永远不会离开while循环。以梅森条件为例:
while (number <= (long)(Math.pow(2, number)) - 1)
如果你从number = 1
开始,你将拥有1 <= 1
,这是真的,你进入循环。在下一次迭代中,您有number = 2
,因此循环检查将为2 <= 3
,因此它将成立。如果你继续这样,第二个术语每次迭代都会更大,你永远不会退出循环。
根据Wikipedia:
梅森素数是一个素数,比一个2的幂小一个。也就是说,对于某些整数n,它是一个素数,可以用Mn = 2 ^ n - 1的形式写出
因此,输入数必须等于2的任意幂-1减1.对于每个输入数,我们需要以exponent = 1
开始并递增它直到结果Math.pow(2, exponent) - 1
相等输入数字(然后我们知道它是一个梅森素数)或输入数字更大(然后我们知道我们走得太远了,输入不是梅森素数)。
在代码中,它会是这样的:
public static boolean isMersennePrime (long number)
{
if (isPrime(number))
{
int exponent = 1;
int powerMinusOne = (long)Math.pow(2, exponent) - 1;
// Iterate until we reach the number
while (number > powerMinusOne){
exponent++;
powerMinusOne = (long)Math.pow(2, exponent) - 1;
}
// If we haven't gone over the number, it is a Mersenne prime
return number == powerMinusOne;
} else {
return false;
}
}
你应该做类似的事情来检查你的号码是否是费马素数。
答案 1 :(得分:0)
你能试试吗?
public static boolean isMersennePrime (long number)
{
boolean mersenne = false;
if (isPrime(number)) {
int count = 2;
while (true) {
long check = (long) (Math.pow(2, count)) - 1;
if (number == check) {
mersenne = true;
break;
}
else if (number < check)
break;
count++;
}
}
return mersenne;
}
public static boolean isFermatPrime(long number) {
boolean fermat = false;
if (isPrime(number)) {
int count = 1;
while (true) {
long check = (long) (Math.pow(2, count)) + 1;
if (number == check) {
fermat = true;
break;
}
else if (number < check)
break;
count++;
}
}
return fermat;
}