在Java中测试素数 - 添加其他条件

时间:2014-07-30 17:19:16

标签: java

初学者。所以我想编写一个程序,打印出所有素数,直到用户输入的数字。例如,用户输入5,程序打印出2和3.那部分我理解,但是我正在努力的是,如果我希望程序打印出用户输入的数字是否为素数(简单是或no)如果输入的数字大于,比方说,50。这是第一部分的代码:

public class Primes {      

  public static void main(String args[]) {    

    System.out.println("All primes up to: ");  

    int num = new Scanner(System.in).nextInt();  

    System.out.println("Prime numbers from 1 to " + num + " are: ");  

    for(int number = 2; number<=num; number++){  
        if(isPrime(number)){  
            System.out.println(number);  
        }   
     }  

  }  

  public static boolean isPrime(int number){  
      for(int i=2; i<number; i++){  
         if(number%i == 0){  
             return false;   
         }  
      }  
    return true;   
  }  
}       

老实说,我无法将我的下一步做什么包裹起来。我的第一个程序("Hello world"不计算; P)。

4 个答案:

答案 0 :(得分:1)

修改:

您当前的代码似乎运行良好。

根据其中一条评论中提到的您的疑问:Yes, but where do I add if statement that does the following: if the number entered is below 50, then the program prints out all the prime numbers up to the entered number. If the number the user entered is bigger than 50, it tells only whether the entered number is prime or not ( simply "It's a prime" or "No, it's not a prime"). Hope that made things clearer

您需要进行的检查是在您输入后:

int num = new Scanner(System.in).nextInt();  

if( number > 50 )
{
    if(isPrime(number))
    {
       // print out is prime
    }
    // print out it is not prime
}

else
{
    System.out.println("Prime numbers from 1 to " + num + " are: ");  

    for(int number = 2; number<=num; number++){  
       if(isPrime(number)){  
            System.out.println(number);  
        }   
    }
 }  

提示:

然而,仅仅触及算法部分,我建议使用Sieve of Eratosthenes来挑选给定范围内的所有素数,如您所要求的那样。

示例:

要查找小于或等于30的所有素数,请按以下步骤操作:

首先生成2到30之间的整数列表:

2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

罢工(筛选出)2的倍数导致:

2  3     5     7     9    11    13    15    17    19    21    23    25    27    29

2之后列表中的第一个数字是3;从列表中获得3的倍数得到:

2  3     5     7          11    13          17    19          23    25          29

3之后列表中的第一个数字是5;从列表中删除剩余的5的倍数:

2  3     5     7          11    13          17    19          23                29

5之后列表中的第一个数字是7,但是7平方是49,大于30,所以过程结束。最终列表包含小于或等于30的所有素数。

以下附带的代码供参考(免责声明:我在this网站上提取此代码。只需将其粘贴在此处即可获得更直接的曝光度。)

代码:

public class PrimeSieve {
public static void main(String[] args) { 
    int N = Integer.parseInt(args[0]);

    // initially assume all integers are prime
    boolean[] isPrime = new boolean[N + 1];
    for (int i = 2; i <= N; i++) {
        isPrime[i] = true;
    }

    // mark non-primes <= N using Sieve of Eratosthenes
    for (int i = 2; i*i <= N; i++) {

        // if i is prime, then mark multiples of i as nonprime
        // suffices to consider mutiples i, i+1, ..., N/i
        if (isPrime[i]) {
            for (int j = i; i*j <= N; j++) {
                isPrime[i*j] = false;
            }
        }
    }

    // count primes
    int primes = 0;
    for (int i = 2; i <= N; i++) {
        if (isPrime[i]) primes++;
    }
    System.out.println("The number of primes <= " + N + " is " + primes);
}
}

答案 1 :(得分:0)

  然而,我正在努力的是,如果我希望程序打印出用户输入的数字是否为素数(简单是或否)。

您当前的isPrime功能似乎有效,所以只需要一个号码并进行测试。

Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
  System.out.println("Enter a number (is it prime): ");
  int num = scanner.nextInt();
  if (isPrime(num)) {
    System.out.printf("%d yes%n", num);
  } else {
    System.out.printf("%d no%n", num);        
  }
}

或者使用三元组,

Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
  System.out.println("Enter a number (is it prime): ");
  int num = scanner.nextInt();
  System.out.printf("%d %s%n", num, isPrime(num) ? "yes" : "no");
}

修改根据您的评论,将您的打印序列移至方法

public static void primesUpTo(int num) {
  System.out.println("Prime numbers from 1 to " + num + " are: ");
  for (int number = 2; number <= num; number++) {
    if (isPrime(number)) {
      System.out.println(number);
    }
  }
}

然后

Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
  System.out.println("Enter a number (is it prime): ");
  int num = scanner.nextInt();
  if (num > 50) {
    System.out.printf("%d %s%n", num, isPrime(num) ? "yes" : "no");
  } else {
    primesUpTo(num); // <-- call the method above.
  }
}

答案 2 :(得分:0)

试试这个..

  int j = 2;   //variable
      int result = 0; //variable
      int number = 0; //variable
      Scanner reader = new Scanner(System.in); //Scanner object
      System.out.println("Please enter a number: "); //Instruction
      number = reader.nextInt(); //Get the number entered
      while (j <= number / 2) //start loop, during loop j will become each number between 2 and 
      {                             //the entered number divided by 2
          if (number % j == 0) //If their is no remainder from your number divided by j...
      {
         result = 1;  //Then result is set to 1 as the number divides equally by another number, hergo
    }                //it is not a prime number
    j++;  //Increment j to the next number to test against the number you entered
  }
  if (result == 1)  //check the result from the loop
  {
   System.out.println("Number: " + number + " is Not Prime."); //If result 1 then a prime     
}
  else
 {
  System.out.println("Number: " + number + " is Prime. "); //If result is not 1 it's not a prime
 }     

这是更有效的方法: -

 public boolean isPrime(int  n) {
        // fast even test.
        if(n > 2 && (n & 1) == 0)
           return false;
        // only odd factors need to be tested up to n^0.5
        for(int i = 3; i * i <= n; i += 2)
            if (n % i == 0) 
                return false;
        return true;
    }

答案 3 :(得分:0)

如果我理解正确的问题:

  • 如果用户输入的数字小于或等于50,则打印所有小于该数字的素数。
  • 否则,只要写入输入的数字是素数。

使用已存在的isPrime()方法:

int num = new Scanner(System.in).nextInt();

if (num <= 50) {
    System.out.println("Prime numbers from 1 to " + num + " are: ");

    for (int number = 2; number <= num; number++) {
        if (isPrime(number)) {
            System.out.println(number);
        }
    }
} else { //num > 50
    if(isPrime(num)) {
        System.out.println(num + " is prime.");
    } else {
        System.out.println(num + " isn't prime.");
    }
}