检查一个数字是否是素数,而不是通过使用额外的isPrime标志来工作



(1)原始问题有问题的解决方案: 这个问题是检查数字是否是素数。

public static void main(String[] args) {
input = new Scanner(System.in);
System.out.println("Enter a prime number ( you think ) : ");
int num = input.nextInt();

isPrime = false;
for(int divisor = 2; divisor < num / 2; divisor++) {
if(num % divisor == 0){

isPrime = false;
}
isPrime = true;
}
if(isPrime) {
System.out.println("Prime");

}
else {
System.out.println("Not a prime");
}
}

(2) ###Updated: 不工作的主要原因是导致问题的标志:isPrime = true;

isPrime = false;
for(int divisor = 2; divisor < num / 2; divisor++) {
if(num % divisor == 0)
{

isPrime = false;
}
isPrime = true; // May 2020: no matter what num, it will become true here.
}

(3) ###Updated:工作溶液用方法:

class Prime {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("Enter a prime number ( you think ) : ");
int num = input.nextInt();
if(ifPrime(num)) {
System.out.println(num + " is a prime number");
}
else {
System.out.println(num + " is a NOT prime number");
}
}
private static boolean ifPrime(int num) {

for(int divisor = 2; divisor < num; divisor++) {
if( num != divisor && num % divisor == 0){
return false;
}
}
return true;
}
}

这里的主要问题是你在每次迭代中都覆盖了isPrime的值,所以如果你检查的最后一个除数没有除num,你把它解释为素数。

更好的方法是假设一个数字是素数,直到证明不是这样(即,直到你找到它的除数)。一旦你找到了这样的除数,你就可以break出圈了——这个数字不是素数,没有理由继续检查它:

isPrime = true;
for(int divisor = 2; divisor <= num / 2; divisor++) {
if (num % divisor == 0) {
isPrime = false;
break; // num is not a prime, no reason to continue checking
}
}

在你的代码中

for(int divisor = 2; divisor < num / 2; divisor++) {
if(num % divisor == 0)
{
isPrime = false;
}
isPrime = true;
}

如果 isPrime = 假,那么你又让它为真!

您可以考虑这一点:

isPrime = true;
for(int divisor = 2; divisor < num / 2; divisor++) {
if(num % divisor == 0)
{
isPrime = false;
break;
}
}

试试这个:

public class prime{
public static void main (String args[]){
int n1=100, n2=1000;
int c=0;
for(int i=n1; i<=n2; i++)
if(isPrime(i)==true)
c++;
System.out.print(c);
}
public static boolean isPrime(int number)
{
for(int j=2; j<number; j++) //u go from number+1 to number to check 
//if it can be divided by any other value.
if(number % j ==0) //if there is 1 other number that divides it then
//it returns false.
return false;
return true; //else it returns true.
}
}

public class PrimeNum {

private static boolean isPrime;
private static Scanner input;
public static void main(String[] args) {
input = new Scanner(System.in);
System.out.println("Enter a number ( you think ) : ");
String ch = input.next();
if (isNumeric(ch)) {
int num = Integer.parseInt(ch);
isPrime = true;
if (num > 1) {
for (int divisor = 2; divisor * divisor <= num; divisor++) {
if (num % divisor == 0) {
isPrime = false;
break;
}
}
} else {
isPrime = false;
}
if (isPrime) {
System.out.println("Prime");
} else {
System.out.println("Not a prime");
}
} else {
System.out.println("Should input a number");
}
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*|\-[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}

}

最新更新