判斷一個數是否是素數


判斷一個數是否是素數

一、判斷一個數是否是素數?

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;    
}

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM