1-n之间的素数

1.常规思路:

给定n. 任取2<=i<=n,  设k=sqrt(i),若果2到k之间的数字全部都不能整除i,那么i就是素数。

2、埃拉托斯特尼筛法:

给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。

实现代码:

public class sushu {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n=300000;
        long t1=System.currentTimeMillis();
       primeFilte(n);
        long t2=System.currentTimeMillis();
       
        Eratosthenes(n);
         long t3=System.currentTimeMillis();
         System.out.println(t2-t1);
         System.out.println(t3-t2);
        System.out.println(isPrime(n));
        
    }
//埃拉托斯特尼筛法:
    private static int Eratosthenes(int n) {
        // TODO Auto-generated method stub
        int num=0;
        boolean filter[]=new boolean[n+1];  //0,1这两个下标废弃不用,因为素数是从2开始的
        for (int i = 2; i <=n; i++) {
            filter[i]=true;              //初始化为true
        }
        
        for (int i = 2; i <=Math.sqrt(n); i++) {
            if (filter[i]) {
                int j=i<<1;   //先翻倍
                while(j<=n){
                    if (filter[j]) {
                        filter[j]=false;     //j是i的倍数,所以不是素数,标志位flase
                    }
                    j+=i;   //分别变成3i,4i......
                }
            }
        }
        
        for (int i = 2; i <= n; i++) {
            if (filter[i]) {
                //System.out.println(i+" ");   不打印是为了测试性能,打印消耗时间,若果你想看到具体素数那就注释掉
                num++;
            }
        }
        
        return num;
    }

    
    //判断是不是素数
    public static boolean isPrime(int n) {

        // TODO Auto-generated method stub
        
        int k,j=0,i=n;
        
            k=(int) Math.sqrt(i);
            for ( j = 2; j <=k; j++) {
                if (i%j==0) break;
            }
            if (j>k) {
                return true;
            }
        
        return false;
    
        
        
    }
    //常规解法
    private static int primeFilte(int n) {
        int i,j,k,num=0;
        for (i = 2; i <=n; i++) {
            k=(int) Math.sqrt(i);
            for (j = 2; j <=k; j++) {
                if (i%j==0) {
                    break;
                }
            }
            if (j>k) {
            //    System.out.println(i+" ");  不打印是为了测试性能,打印消耗时间,若你想看到具体素数那就注释掉
                num++;
            }
        }
        
    
        return num;
    }
      
}

测试结果:

n=30W时,测试结果毫秒级

时间: 2024-10-13 16:17:39

1-n之间的素数的相关文章

求100到200之间的素数

质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能整除以其他自然数(质数),换句话说就是该数除了1和它本身以外不再有其他的因数. /** * 判断100 ~ 200间素数的个数 * * @author Administrator */ public class IsPrime { public static void main(String[] args) { // 遍历100 ~ 200 之间的素数 for (int i=100; i<=200; i

1到100之间的素数

1 /* 2 * 求1到100之间的质数 3 */ 4 public class Zy3 { 5 public static void main(String[] args) { 6 System.out.print("1到100之间的素数有:\n"+"\t"+1+"\n"); 7 int j=0; 8 for(int i=2;i<100;++i){ 9 for(j=2;j<i;++j){ 10 if(i%j==0) 11 break

打印100~200 之间的素数

编写思想:对100到200之间的数依次进行for循环判断,看其是否为素数.判断方法:对于一个自然数,除了1以外,不是素数就是合数.若该数字是素数,则不能被除了1和它自身以外的数整除:而一个数如果是合数,则它的所有因子不会大于对其开根号所得出的数,由此可得出每个数最多时候的循环次数. 初次生成的源代码如下: #include<stdio.h> #include<math.h> int main() { int primer,variabe,sign; for(primer=101;p

判断100-200之间的素数

#include<stdio.h>/*判断100-200之间的素数*/int main (){ int num,point,rem,temp; for(num=100;num<=200;num++) {  point=1;  for(temp=2;temp<num;temp++)  {   rem=num%temp;   if(rem==0)   {    point=0;    break;   }  }  if(point==1)   printf("%d "

C语言学习笔记--求100-999之间的素数(用函数调用)

编写函数prime(n),如果n为素数,return 1,否则return 0.在main函数中调用函数prime(n),求100-999之间的素数 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int prime(int i); 6 int i; 7 for(i=100;i<=999;i++) 8 { 9 prime(i); 10 if(prime(i)==1) 11 { 12 printf("

java 每日习题(四)求101-200之间的素数

1 package everyDay; 2 3 /* 4 * 查找 101 - 200之间的素数 5 */ 6 public class FindPrimeNumber { 7 8 public static void main(String[] args) { 9 10 System.out.println("primeNumber is :"); 11 12 for (int primeNumber = 101; primeNumber <= 200; primeNumber

c语言打印100~200之间的素数

素数即就是该数除了1和它本身以外不再有其他的因数,否则称为合数. 找寻100~200之间的素数的算法:让a被2~√a除,若a不能被整除,则a是素数. #include<stdio.h> #include<math.h> int main() {    int a,k,i;//数a     printf("100~200以内的prime\n");      for (a=101;a<=200;a=a+2)   {  k= sqrt(a);    for (i

Java基础知识强化04:判断101~200之间有多少素数

判断101~200之间有多少素数? 1 package himi.hebao; 2 3 /** 4 * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否为素数,并且计数count 5 * 6 * @author Administrator 7 * 8 */ 9 10 public class TestDemo05 { 11 12 public static void main(String[] args) { 13 int count =

COJ 3018 求1~n之间的素数

求1~n之间的素数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述  素数是大于1,且除1和本身以外不能被其他整数所整除的数.要求输出1~n之间的素数. 输入 正整数n 输出 1~n之间的所有素数,包括n,数字之间用一个空格隔开,第一个数字前不能有空格. 输入示例 10 输出示例 2 3 5 7 其他说明 n是大于1且不大于100的正整数 题解:可以练习一下MR(都不会打了) 1 #include<iostream> 2

C语言打印100—200之间的素数

质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能整除以其他自然数(质数),换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.  根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.最小的质数是2. 目前为止,人们未找到一个公式可求出所有质数. C语言代码如下:     # include <stdio.h> int main()