精华内容
下载资源
问答
  • C++判断是否素数质数

    千次阅读 2020-07-16 11:46:16
    2只有2个因数,属于质数素数 那么怎么判断一个数是素质数呢 拿64来说,64有因数1,2,4,8,16,32,64 看64的因数是成对出现的 结论:任何一个合数它的因数都是成对出现的 那么是素数怎么判断 为了让程序更加...

    素数就是除1和它本身外没有其他的因数了叫做素数
    1只有1个因数1,所有1既不是合数也不是素数
    4有3个因数,属于合数
    2只有2个因数,属于质数或素数

    那么怎么判断一个数是素质数呢

    在这里插入图片描述
    拿64来说,64有因数1,2,4,8,16,32,64

    看64的因数是成对出现的

    在这里插入图片描述
    结论:任何一个合数它的因数都是成对出现的
    那么是素数怎么判断
    为了让程序更加整洁,快速,我们不妨可以这样想
    一个数如果它的一半还没有因数,那么这个数就是质数

    抛开1和它本身,把除数定为2

    我们第一次判断这个数时,把初始的除数定为2
    3%2=1,不能整除
    此时2已经是3的一半多了,所以3是质数


    17%2=1,不能整除
    将除数+1为3
    17%3=2,不能整除
    将除数+1为4
    17%4=1,不能整除



    一直到
    17%9=8,不能整除
    此时9已经大于了17的一半,所以17是质数

    更加整洁使用开平方sqrt

    我们已经会判断是不是质数了,但是为了更加整洁
    将大于n的一半改为大于开n的平方
    64的平方根是8,那么8的前面已经有因数2,4了
    9的平方根是3,那么3正好是9的因数
    可见,这样的算法更加整洁,快速

    源码

    #include<iostream>
    #include<cmath>//开平方必须加入头文件
    using namespace std;
    bool op(int n,int m)//判断素数,n为判断的数,m为除数,初始值为2
    {
        if(m>sqrt(n)) return true;//如果搜到了它的开平方还没有因数,判断这个数一定是素数,返回值为true
        if(n%m==0) return false;//如果可以被整除则不是素数,返回值为false
        op(n,m++);//递归,每次让除数m+1
    }
    int main()
    {
        int n;
        cin>>n;//输入一个数
        if(op(n,2))//如果返回值为true
        {
            cout<<n<<"为一个素数";//输出n为一个素数
        }
        else//如果返回值为false
        {
            cout<<n<<"不为一个素数";//输出n不为一个素数
        }
        return 0;
    }
    
    展开全文
  • 传送门 洛谷p3383代码 例题洛谷p3383。 需要特判1不是素数

    传送门

    洛谷p3383代码
    例题洛谷p3383。

    在这里插入图片描述

    需要特判1不是素数。

    展开全文
  • 判断一个数是否质数素数)的4种方法

    万次阅读 多人点赞 2019-07-20 15:38:30
    2.如何判断是否质数方法1 方法2 方法3 方法4 1.什么是质数? 首先来看质数的概念: 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义...

    目录

    1.什么是质数?

    2.如何判断是否为质数?

    方法1

    方法2

    方法3

    方法4


    1.什么是质数?

    首先来看质数的概念:

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)

     

    图1  数字12不是质数,而数字11是质数

    如上图所示,数字12可以将每4个分成一组,一共3组;而数字11将每4个、每5个、每3个分成一组都无法全部分完,而有剩余,因此将数字11称为质数。

     

    2.如何判断是否为质数?

    质数的特点如下:

    一个自然数(如1、2、3、4、5、6等)若恰有两个正约数(1及此数本身),则称之为质数。

    方法1

    根据质数的约数只有1和本身这一特点,可以首先想到最直观的方法。第一种方法就是判断一个数是否能被比它小的数整除

    方法1的时间复杂度是O(n)。

    public static boolean isPrime(int n){
        //n<=3时,质数有2和3
        if (n <= 3) {
            return n > 1;
        }
        //当n>3时,质数无法被比它小的数整除
        for(int i = 2; i < n; i++){
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    方法2

    当一个数不是质数时,必定存在两个约数,一个大于等于sqrt(n),另一个小于sqrt(n)。利用这种特性,可以对方法1进行改进,只判断数n能否被小于sqrt(n)的数整除。

    方法2的时间复杂度是O(sqrt(n))。

    图2  筛选判断集,只选择小于等于sqrt(n)的集合

     

    public static boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        //判断一个数能否被小于sqrt(n)的数整除
        int sqrt = (int)Math.sqrt(n);
        for (int i = 2; i <= sqrt; i++) {
            if(n % i == 0) {
                return false;
            }
        }
        return true;
    }

    方法3

    任一偶数一定能分解为2和其他偶数/奇数的积,因此一个数不能被2整除,那么这个数一定不能被其他偶数整除。利用这个特点,可以对方法2进行改进,判断数n能否被小于sqrt(n)的奇数整除。

    方法3的时间复杂度是O(sqrt(n)/2)。

    图3  进一步筛选判断集,只选择小于等于sqrt(n)的奇数
    public static boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        //只需判断一个数能否被小于sqrt(n)的奇数整除
        int sqrt = (int)Math.sqrt(n);
        for (int i = 3; i <= sqrt; i += 2) {
            if(n % 2 == 0 || n % i == 0) {
                return false;
            }
        }
        return true;
    }

    方法4

    质数的分布具有特点,经过证明可以得到,(大于等于5的)质数一定和6的倍数相邻,一定是6x-1或6x-1。利用这种特性。可以对整数进行筛选,只判断那些是6x-1或6x-1的整数是否为质数。

    图4  筛选数据集,只选择6的倍数相邻的数

    证明过程如下:

    令x≥1,将大于等于5的自然数表示如下: ······6x-1,6x,6x+1,6x+2,6x+3,6x+4······(相邻6个数为一组)

    在以上的数字中,6x、6x+2和6x+4是偶数,一定不是质数;6x+3可以分解为3(2x+1),不是质数,因此质数只能是6x-1和6x+1。

    public static boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        // 只有6x-1和6x+1的数才有可能是质数
        if (n % 6 != 1 && n % 6 != 5) {
            return false;
        }
        // 判断这些数能否被小于sqrt(n)的奇数整除
        int sqrt = (int) Math.sqrt(n);
        for (int i = 5; i <= sqrt; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }

     

    展开全文
  • 判断质数/素数——我知道的最快方法

    万次阅读 多人点赞 2017-12-01 20:23:32
    标准版:大部分人都知道的比较方法判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n)) 高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2) 尊享...

    标准版:大部分人都知道的比较快的方法:判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))

    高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)

     

    尊享版:

    首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

    证明:令x≥1,将大于等于5的自然数表示如下:

    ··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···

    可以看到,不和6的倍数相邻的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。因此在5到sqrt(n)中每6个数只判断2个,时间复杂度O(sqrt(n)/3)。

    在高配版和尊享版中,都是一个剪枝的思想,高配版中裁剪了不必要的偶数,尊享版中裁剪了不和6的倍数相邻的数,虽然都没有降低时间复杂度的阶数,但都一定程度上加快了判断的速度。

    在此给出尊享版C++代码:

     

    #include <iostream>
    #include <math.h>
    using namespace std;
    int isPrime(int n)
    {	//返回1表示判断为质数,0为非质数,在此没有进行输入异常检测
    	float n_sqrt;
    	if(n==2 || n==3) return 1;
    	if(n%6!=1 && n%6!=5) return 0;
    	n_sqrt=floor(sqrt((float)n));
    	for(int i=5;i<=n_sqrt;i+=6)
    	{
    	    if(n%(i)==0 | n%(i+2)==0) return 0;
    	}
            return 1;
    } 
    int main()
    {
    	int flag;
    	flag=isPrime(37);
    	cout<<flag<<endl;
    	return 0;
    }

     

    python 版代码参考:https://github.com/hichenway/UsefulCode/blob/master/isPrimeFunction.py

     

     

     

    展开全文
  • 【算法】素数(质数)判断方法

    万次阅读 多人点赞 2017-11-29 17:05:32
    素数(质数)的判断在算法问题中经常遇到,这里小结几种常用的...我们可以从它的定义得到判断素数的 第一个方法: 从2到n - 1, 判断是否存在能被n整除的数,既(n%i == 0, 2 ),如果有就不是素数,否则为素数。(这里为了比
  • 判断质数 素数——我知道的最快方法.pdf
  • 计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效。1)直观判断法直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否...
  • 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。... 前几天偶尔的有朋友问python怎么判断素数方法,走网上查了查,总结了python脚本判断
  • 标准版:大部分人都知道的比较方法判断从 2 到 sqrt(n) 是否存在其约数,时间复杂度 O(sqrt(n)) 高配版:判断 2 之后,就可以判断从 3 到 sqrt(n) 之间的奇数了,无需再判断之间的偶数,时间复杂度 O(sqrt(n)...
  • 费马小定理:假如p是质数,a是整数,且a、p互质,那么a的(p-1)次方除以p的余数恒等于1,即:a^(p-1)≡1(mod p)。3.米勒拉宾素性检验法。二次探测定理:如果p是一个素数,04.综合法。试除法+米勒拉宾素性检验。5.AKS...
  • 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,...
  • 判断素数最快方法

    2021-05-25 09:36:53
    判断素数最快方法 1、普通方法 bool is_prime(int n) { if (n < 2) return false; int i; for (i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; } 原理是对每个数进行...
  • 一种快速判断是否质数方法

    千次阅读 2008-02-22 21:23:00
    看起来不错。竹子大哥写的。不过,有原理解释一下就好了。http://blog.csdn.net/java2000_net/archive/2007/12/25/1966512.aspx 
  • 快速判断素数方法

    2020-07-10 16:30:19
    做OJ的时候碰到了一个判断素数方法,考虑到素数使用传统暴力方法比较耗时间,所以参考了以下这篇文章,做了个笔记。 https://www.cnblogs.com/IceHowe/p/11186862.html。 常规方法 素数的定义是大于1的自然数中,...
  • 算法一:针对输入的数字x,我们可以遍历从2到x-1这个区间中的数,如果x能被这个区间中任意一个数整除,那么它就不是质数。 def is_prime1(x): for i in range(2, x): if num % i == 0: return False return ...
  • import java.util.*; public class A{ public static void main(String[] args){ System.out.println("数字:"); Scanner sc =new Scanner(System.in);...//如果一个数是素数,那么这个数除以一到他的开方一
  • 判断素数最快方法

    2020-09-14 14:17:49
    首先判断特殊的,1不是素数,2和3是素数。 其次剩下的所有数都看作是6n、6n+1、6n+2、6n+3、6n+4、6n+5,显然6n、6n+2=2(3n+1)、6n+3=3(2n+1)、6n+4=2(3n+2)都不为素数。所以每六个数的循环中只需判断6n+1和6n+5。 ...
  • 一种判断大数是否素数方法

    千次阅读 2018-07-14 10:34:11
    判断大数是否素数在很多题中有所涉及,也一直让我很头疼。我在网上搜集了一些资料,有很多方法可以用来判断,我找到的方法中复杂度最低的是利用小费马定理来判断,但苦于水平不够,对这种方法的理解陷入了云里雾里...
  • 素数(质数)判断方法

    2019-08-13 09:46:37
    标准版:大部分人都知道的比较方法判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n)) 高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2) 尊享...
  • 判断一个数P是否素数的一般方法: 方法1:k从2开始,到n-1为止,判断P是否可以整除k 改进1:k到sqrt(P)为止 改进2:k从3开始且只考虑奇数 时间复杂度:O(P) 一个更的算法:Miller-Rabin算法 实现:在2-P-...
  • 一种快速判断是否质数方法

    千次阅读 2008-02-26 09:40:00
    public static boolean isprime(int x) ...{ if (x 7) ...{ if (x == 2 || x == 3 || x==5 || x == 7) return true; } int c = 7; if (x % 2 == 0) return false;...
  • 素数快速判断方法

    千次阅读 2019-05-25 12:30:38
    原理:大于等于5的素数与6的倍数相邻 证明 所有自然数可以用集合A = { 6n, 6n+1, 6n+2, 6n+3, 6n+4, 6n+5 }表示,其中 n >= 0,显然,子集B = {6n, 6n+2, 6n+3, 6n+4}内的元素都不是素数,所以只有6n+1和6n+5可能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,985
精华内容 8,394
关键字:

判断是否是质数的快速方法