求质数的几种算法

1、根据质数的定义求

  质数定义:只能被1或者自身整除的自然数(不包括1),称为质数。
  利用它的定义可以循环判断该数除以比它小的每个自然数(大于1),如果有能被它整除的,则它就不是质数。
对应代码是:
void printPrime(int n){//判断n是否是质数
        boolean
isPrime=true;//是否是质数的标志
        for(int
i=n-1;i>1;i—){//n除以每个比n小比1大的自然数

if(n%i==0){//如果有能被整除的,则不是质数
               
isPrime=false;
           
}
        }
       
if(isPrime){//如果是质数,则打印出来
           
System.out.print(n+" ");
           
primeNumber++;//记录质数的个数
           
if(primeNumber%10==0)//输出10个质数后换行
               
System.out.println();
        }
}
2、利用一个定理——如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。例如:50,最小质因数是2,2<50的开根号

再比如:15,最小质因数是3,3<15的开根号
  合数是与质数相对应的自然数。一个大于1的自然数如果它不是合数,则它是质数。
  上面的定理是说,如果一个数能被它的最小质因数整除的话,那它肯定是合数,即不是质数。所以判断一个数是否是质数,只需判断它是否能被小于它开跟后后的所有数整除,这样做的运算就会少了很多,因此效率也高了很多。

对应代码是:
void printPrime(int n){//判断n是否是质数
        boolean
isPrime=true;//是否是质数的标志
        int
s=(int)Math.sqrt(n);//对n开根号
        for(int
i=s;i>1;i—){//n除以每个比n开根号小比1大的自然数

if(n%i==0){//如果有能被整除的,则不是质数
               
isPrime=false;
           
}
        }
       
if(isPrime){//如果是质数,则打印出来
           
System.out.print(n+" ");
           
primeNumber++;//记录质数的个数
           
if(primeNumber%10==0)//输出10个质数后换行
               
System.out.println();
        }
}
3、筛法求质数,效率最高,但会比较浪费内存
  首先建立一个boolean类型的数组,用来存储你要判断某个范围内自然数中的质数,例如,你要输出小于200的质数,你需要建立一个大小为201(建立201个存储位置是为了让数组位置与其大小相同)的boolean数组,初始化为true。

  其次用第二种方法求的第一个质数(在此是2),然后将是2的倍数的数全置为false(2除外),即2、4、6、8……位置上置为false。然后是
3的倍数的全置为false(3除外),一直到14(14是200的开平方),这样的话把不是质数的位置上置为false了,剩下的全是质数了,挑着是
true的打印出来就行了。

对应代码是:
boolean[] printPrime(int range){
        boolean[] isPrime=new
boolean[range+1];
       
isPrime[1]=false;//1不是质数
        Arrays.fill(isPrime,
2,range+1,true);//全置为true(大于等于2的位置上)
        int
n=(int)Math.sqrt(range);//对range开根号
        for(int
i=2;i<=n;i++)//注意需要小于等于n
           
if(isPrime[i])//查看是不是已经置false过了
               
for(int j=i;j*i<range;j++)//将是i倍数的位置置为false
                   
isPrime[j*i]=false;
        return
isPrime;//返回一个boolean数组
}

时间: 2024-10-24 05:24:43

求质数的几种算法的相关文章

求逆元的四种算法(拓欧费马小线性推欧拉)

求逆元的四种算法 拓展欧几里得算法求逆元 上一篇博客中已经讲过拓展欧几里得算法,并且讲解了求逆元的原理.这里只列出代码 在要求逆元的数与p互质时使用 代码 //扩展欧几里得定理 int ex_gcd(int a,int b,int& x,int& y) { if(b==0) { x=1; y=0; return a; } int ans = ex_gcd(b,a%b,x,y); int tmp = x; x = y; y = tmp-a/b*y; return ans; } int cal

求最短路径的三种算法: Ford, Dijkstra和Floyd

Bellman-Ford算法 Bellman-Ford是一种容易理解的单源最短路径算法, Bellman-Ford算法需要两个数组进行辅助: dis[i]: 存储顶点i到源点已知最短路径 path[i]: 存储顶点i到源点已知最短路径上, i的前一个顶点. 若图有n个顶点, 则图中最长简单路径长度不超过n-1, 因此Ford算法进行n-1次迭代确保获得最短路径. Ford算法的每次迭代遍历所有边, 并对边进行松弛(relax)操作. 对边e进行松弛是指: 若从源点通过e.start到达e.sto

用c#求质数的两种方法

求1到100的中的质素 方法1: Console.Write("1到100中的质数有:");   for(int i=1;i<=100;i++){ int m=0; for(int j=1;j<=i;j++){ if(i%j==0){ m++; } } if(m==1){ Console.Write(i+"  "); }else if(m==2){ Console.Write(i+"  "); } } 方法2: Console.Wri

C#中质数的两种算法

一.判断1到该数本身一共能被多少数整除,若只能被两个数整除,则该数为质数. int n = 0; for(int i = 1; i < = num; i++){ //遍历1-num的所有整数与num相除,得出num能被多少个数整除 if(num%i==0){ n++; } } if(n == 2){ //只能被两个数整除,则num为质数 //num是质数 } else{ //num不是质数 } 二.判断该数除1和本身,是否能被其他数整除,若不能,则该数为质数. bool s = false; f

求质数的两种方法1-100

// 1-100以内质数的和 for (int i = 1; i <= 100; i++) { boolean b = true; if (i != 1) { for (int j = 2; j < i; j++) { if (i % j == 0) { b = false; break; } } if (b) { System.out.println(i); } } } System.out.println("************************************

求质数的各种算法

首先声明本人水平有限,仅仅做一下记录,有错的地方请指正,文章垃圾请包容!! 在网上不小心浏览到一篇技术博客,叫做<求质数算法的N种境界(N>10)>,写得很好,有兴趣的读者自己去搜索.然后就想自己去试试这篇博客里写得各种求质数的方法. 不想搭环境,就暂时用了PHP语言,在apache里运行,简易测试一下. 首先明确一下概念 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中, 除了1和它本身以外不再有其他因数的数称为质数. 100以内质数表 2 3 5 7

C语言求质数的算法

前言 上次被出了一题质数的C语言求解题目(面试),当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本: 判断 x 是否为质数,就从 2 一直算到 x-1. static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++) { array1[i - 1] = 0; } rt_uint32_t x, y = 0, z = 0; rt_uin

谈谈&quot;求线段交点&quot;的几种算法(js实现,完整版)

"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. 本文讲的内容都很初级, 主要是面向和我一样的初学者, 所以请各位算法帝们轻拍啊 嘎嘎 引用 已知线段1(a,b) 和线段2(c,d) ,其中a b c d为端点, 求线段交点p .(平行或共线视作不相交) =============================== 算法一: 求两条线段所在直线的交点, 再

求线段交点&quot;的几种算法(js实现,完整版)

"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法说一说, 希望对大家有所帮助. 本文讲的内容都很初级, 主要是面向和我一样的初学者, 所以请各位算法帝们轻拍啊 嘎嘎 引用 已知线段1(a,b) 和线段2(c,d) ,其中a b c d为端点, 求线段交点p .(平行或共线视作不相交) 算法一: 求两条线段所在直线的交点, 再判断交点是否在两条线段上. 求直线交点时 我们可通过直线的一般方程