判斷一個數是否是素數
一、判斷一個數是否是素數?
public boolean isPrimeNumber(int num){
if(num == 2) return true; //2特殊處理
if(num < 2 || num % 2 == 0) return false; //識別小於2的數和偶數
for(int i=3; i<=Math.sqrt(num); i+=2){
if(num % i == 0){ //識別被奇數整除
return false;
}
}
return true;
}
質數的定義:質數(prime number)又稱為素數,有無限多個。質數定義在大於1的自然數中,除了1和它本身以外不會再有其它因數的數稱為質數。 (1)從2開始,2是最小的質數。 (2)除了2之外的偶數全都不是質數,因為除了1和自身之外它們還能被2整除。若為大於2的奇數,則進入下一步繼續判斷。 (3)將其開方,若從3到開方向下取整之間的所有奇數都不能將其整除,則說明該數為質數。 至於為什么只用除到其平方根? 因為如果一個數不是素數是合數,那么一定可以由兩個自然數相乘得到,其中一個大於或等於它的平方根,一個小於或等於它的平方根。
二、三種素數之間的比較?
package Java基礎;
public class TestPrime {
public static void main(String[] args) {
long startTime1 = System.currentTimeMillis();
for(int i=1;i<=100;i++){
if(isPrime1(i)){
System.out.print(i+" ");
}
}
long endTime1 = System.currentTimeMillis();
System.out.println("方式一消耗時間:"+(endTime1-startTime1));
long startTime2 = System.currentTimeMillis();
for(int i=1;i<=100;i++){
if(isPrime2(i)){
System.out.print(i+" ");
}
}
long endTime2 = System.currentTimeMillis();
System.out.println("方式二消耗時間:"+(endTime2-startTime2));
long startTime3 = System.currentTimeMillis();
for(int i=1;i<=100;i++){
if(isPrime3(i)){
System.out.print(i+" ");
}
}
long endTime3 = System.currentTimeMillis();
System.out.println("方式三消耗時間:"+(endTime3-startTime3));
}
/*
* 1. 根據概念判斷:
如果一個正整數只有兩個因子, 1和p,則稱p為素數.
時間復雜度O(n).
*/
public static boolean isPrime1(int n) {
if (n < 2)
return false;
for (int i = 2; i < n; ++i)
if (n % i == 0)
return false;
return true;
}
/*
* 2. 改進, 去掉偶數的判斷
時間復雜度O(n/2), 速度提高一倍.
*/
public static boolean isPrime2(int n) {
if (n < 2)
return false;
if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (int i = 3; i < n; i += 2)
if (n % i == 0)
return false;
return true;
}
/*
* 3. 進一步減少判斷的范圍
定理: 如果n不是素數, 則n有滿足1< d<=sqrt(n)的一個因子d.
證明: 如果n不是素數, 則由定義n有一個因子d滿足1< d< n.
如果d大於sqrt(n), 則n/d是滿足1< n/d<=sqrt(n)的一個因子.
時間復雜度O(Math.sqrt(n)/2), 速度提高O((n-Math.sqrt(n))/2).
*/
public static boolean isPrime3(int n) {
if (n < 2)
return false;
if (n == 2)
return true;
if (n % 2 == 0)
return false;
for (int i = 3; i * i <= n; i += 2)
if (n % i == 0)
return false;
return true;
}
}
三、質數檢測
給出N個正整數,檢測每個數是否為質數。如果是,輸出"Yes",否則輸出"No"。
Input
第1行:一個數N,表示正整數的數量。(1 <= N <= 1000)
第2 - N + 1行:每行1個數(2 <= S[i] <= 10^9)
Output
輸出共N行,每行為 Yes 或 No。
Input示例
5
2
3
4
5
6
Output示例
Yes
Yes
No
Yes
No
Java 代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] nums = new int[n];
int m = 0;
while(n--!=0){
nums[m++] = scan.nextInt();
}
for(int i:nums){
if(isPrime(i)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
}
public static boolean isPrime(int n){
if(n<2) return false;
if(n==2) return true;
if(n%2 == 0) return false;
for(int i=3;i*i<=n;i++){
if(n%i==0)
return false;
}
return true;
}
}
四、找出0-50之間的所有素數,所謂素數就是只能被1和它本身整除的數字,比如:7,13,23等。
#include <stdio.h>
int main()
{
int m, n;
for(m=2; m<=50; m++)
{
for(n=2; n<m; n++)
{
if(m%n==0) //什么條件下跳出當前循環
break; //這里應該退出當前循環了
}
if(m == n) //n循環結束后,如果m=n的話就輸出m
printf("%d ", m);
}
return 0;
}
參考資料