zoukankan      html  css  js  c++  java
  • 判断一个数是否是素数

    判断一个数是否是素数

    一、判断一个数是否是素数?

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

    参考资料

  • 相关阅读:
    jsonp 跨域解决 spring
    goEasy消息推送,pushlet 向特写用户实时推送
    支持中文加密解密
    webservice 小小例子
    DES加密
    线程、异步
    mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释
    Log4j按级别输出到不同文件
    niginx 负载均衡
    node-webkit安装及简单实现
  • 原文地址:https://www.cnblogs.com/hgnulb/p/10041426.html
Copyright © 2011-2022 走看看