素数 订阅
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 展开全文
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
信息
讨论范围
非0自然数
定    义
只有1和它本身两个因数的自然数
别    名
素数
中文名
质数
反义词
合数
外文名
prime  number
质数定义
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
收起全文
精华内容
下载资源
问答
  • 素数

    2020-02-16 10:58:34
    素数 「质数」又称素数,有无限个。素数定义为在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的数称为素数。 例如17就是素数,因为它不能被2 - 16的任一整数整除。 请用程序实现: 输入一个大于 1 的整数...

    素数

    「质数」又称素数,有无限个。素数定义为在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的数称为素数。

    例如17就是素数,因为它不能被2 - 16的任一整数整除。

    请用程序实现: 输入一个大于 1 的整数num,输出1~num(含)中的所有的素数(每行输出1个素数,从小到大排列)。

    # 请使用 input() 输入一个整数 num
    num = int(input('请输入一个整数: '))
    
    # 输出 1 - num(含) 中的所有的素数
    for i in range(2,num+1):
        fg=0
        for j in range(2,i-1):
            if i%j ==0:
                fg=1
                break
        if fg==0:
            print(i)
    
    展开全文
  • 素数基本(埃氏筛法/线性筛法)

    万次阅读 多人点赞 2018-08-07 18:32:00
    一、检查n是否为素数 最简单思路:所有可能的因数全部试一遍。 int gg(int n) { for(int i=2;i<n;i++){ if((n%i)==0)return 0;//有因数就不是素数咯 } return 1; } 进一步思考:没必要枚举所有...

    一、检查n是否为素数

      

    最简单思路:所有可能的因数全部试一遍。

     

    int gg(int n)
    {
        for(int i=2;i<n;i++){
            if((n%i)==0)return 0;//有因数就不是素数咯
        }
        return 1;
    }

     

    进一步思考:没必要枚举所有的数,每一个小于n^(1/2)的因数i,一定有一个大于n^(1/2)的因数j与之对应,也就是i*j=n,所以枚举小于等于n^(1/2)的因数即可

     

    int gg(int n)
    {
        for(int i=2;i*i<=n;i++){
            if((n%i)==0)return 0;
        }
        return 1;
    }

     

    二、约数枚举

     上面已经说过,不需要枚举所有因数,枚举出某小因数以后算出对应的大因数即可。

    vector<int> gg(int n)
    {
        vector<int> a;
        for(int i=2;i*i<=n;i++){
            if((n%i)==0){
                a.push_back(i);
                if((n/i)!=i)a.push_back(n/i);//根号n的情况不要重复添加
            }
        }
        return a;
    }

     

    三、埃氏筛法

     只对一个整数操作,O(N),已经足够了,如果对许多整数进行素性检测,还有更高效的算法,比如埃氏筛法。

    问题:枚举n以内所有素数

    操作:先把所有整数列出来,然后把2的倍数全部剔除,然后是三的,以此类推,遍历所有素数,把倍数全部划去。

    对于每个数字i,如果没被划去,他一定是素数,因为他不是任何2到i-1数字的倍数。然后就开始划它的倍数就好。

    int a[maxx];
    int b[maxx+1];
    int gg(int n)
    {
        int p=0;//记录素数个数
        for(int i=0;i<n+1;i++)b[i]=1;
        b[0]=0;
        b[1]=0;
        //准备完毕
        for(int i=2;i<=n;i++){
            if(b[i]){
                a[p++]=i;//记录素数和个数
                for(int j=2*i;j<=n;j+=i)b[j]=0;//剔除倍数
            }
        }
        return p;//返回素数个数
    }

    四、区间筛法

     给定整数a和b,请问区间[a,b)内有多少个素数? 

    思路:之前说过,因为b以内合数的最小质因数一定不超过sqrt(b),如果有sqrt(b)以内的素数表的话,就可以把筛选法用在[a,b)上了,先分别做好[2,sqrt(b))的表和[a,b)的表,然后从[2,sqrt(b))的表中筛得素数的同时,也将其倍数从[a,b)的表中划去,最后剩下的就是区间[a,b)内的素数了。

    //不gg了,这次就来个标准一点的吧
    typedef long long ll;
    bool is_prime[maxn];
    bool is_prime_small[maxn];
    void segment_sieve(ll a,ll b) 
    {
         for(ll i=0;i*i<b;++i) is_prime_small[i]=true; //初始化
         for(ll i=0;i<b-a;++i) is_prime[i]=true; //初始化,注意下标变化,为了省空间
         for(ll i=2;i*i<b;++i) {
             if(is_prime_small[i]) {
                 for(ll j=2*i;j*j<b;j+=i) is_prime_small[j]=false;  //筛选[2,sqrt(b));
                 //(a+i-1)/i得到最接近a的i的倍数,最低是i的2倍,然后筛选
                 for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;
             }
         }
    }

    五、线性实现

    筛法很多数被处理了不止1遍,比如6,在素数为2的时候处理1次,为3时候又处理一次,因此又造成了不必要处理。O(nloglogn)已经基本可以满足一般需要了。

    本代码保证每个合数只会被它的最小质因数筛去,因此每个数只会被标记一次,所以时间复杂度是O(n)

    证明略

    话不多说,上板子

    #include<cstdio>
    #include<cstring>
    #define MAXN 100005
    #define MAXL 1299710
    int prime[MAXN];
    int check[MAXL];
    int tot = 0;
    memset(check, 0, sizeof(check));
    for (int i = 2; i < MAXL; ++i)
    {
        if(!check[i])prime[tot++] = i;
        for (int j = 0; j < tot; ++j)//****************************************
        {
            if (i * prime[j] > MAXL)break;//*******************
            check[i*prime[j]] = 1;
            if (i % prime[j] == 0)break;//******
        }
    }

    素数基本就这些内容咯。。。。

    展开全文
  • C语言求素数的两种方法

    万次阅读 多人点赞 2018-02-07 09:33:07
    1,判断n是否能被2~n-1整除 ...注意:1不是素数素数是指大于1的自然数,除了1和该数自身外,无法被其他自然数整除的数。 法一: #include<stdio.h> int main() { int i, n; printf("please input a nu...

    1,判断n是否能被2~n-1整除

    输入的数n不能被2-(n-1)整除,说明是素数

    输入的数n能被2-(n-1)整除,说明不是素数

    注意:1不是素数,素数是指大于1的自然数,除了1和该数自身外,无法被其他自然数整除的数。

    法一:

    #include<stdio.h>
    int main()
    {
        int i, n;
        printf("please input a number:"); 
        scanf("%d", &n);
        for (i = 2; i < n ; i++)
        {
            if (n%i == 0)
                break;
        }
        if (n <=1 ) printf("This is not a prime\n");
        else  if (i < n) printf("This is not a prime.\n"); 
        else printf("This is a prime.\n");
        return 0;
    
    }

    法二:

    #include<stdio.h>
    int main()
    {
        int i, n;
        printf("please input a number:"); 
        scanf("%d", &n);
        if(n<=1)
            printf("This is not  a prime\n");
        else
            {
            for (i = 2; i < n ; i++)
    	    {
                 if (n%i == 0)
                 break;
    	     }
             if(i>=n)
    	        printf("This is a prime\n");
             else
    	        printf("This is not a prime\n");
    	  }
    	 return 0;
    }

     

     

     

     

    2,判断n是否能被2~√n间的整数整除

    输入的数n不能被2-√n整除,说明是素数

    输入的数n能被2-√n整除,说明不是素数

     

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int n,i;
        double k;
        printf("please input a number:"); 
        scanf("%d", &n);
        k = sqrt(n);
        for (i = 2; i <= k;i++)
        {
            if (n%i == 0) break;
        }
        if (n <=1 ) printf("This is not a prime\n");
        else if (i <= k) printf("This is not a prime.\n");
        else printf("This is a prime\n");
        return 0;
     
    }

    法二:

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int n,i,k;
        printf("please input a number:"); 
        scanf("%d", &n);
        if(n<=1)
            printf("This is not  a prime\n");
        else
        {
            k=sqrt(n);
            for (i=2;i<=k;i++)
            {
                if (n%i==0)
                break;
            }
            if(i>=k+1) 
                printf("This is a prime.\n");	
            else 
                printf("This is not a prime.\n");
        }
        return 0; 
    }

    以上两个程序的法二:Modified on April 22, 2019

    对于评论出现的问题,在此整理一下

    运行软件: VC++ 6.0

     

    weixin_43912791: 这段代码识别不了1啊。。

    回答:素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。所以没考虑1的情况。

     

    weixin_43412408: 能问下i>k的逻辑是什么?想不太明白

    第二个方法:对一个数n,如果他能分解成n=pq,那么pq里必然有一个大于等于根号n一个小于等于根号n,也就是说一个合数n必然有一个因子是小于等于根号n的. 所以对一个数n,只要检验他有没有小于等于根号n的因子就可以了(检验小于等于n的因子使循环次数变少,这也是简化的原因)

     

    写这篇文章的初衷是给自己提供一个思路,没有考虑太多的情况,没想到这么多人看,所以重新整理了一下代码。

    感谢@ 锦言肾行的分享

     

     

    素数的定义是只能被1和他本身整除,1不是素数.因此要判断一个数是否为素数.就要判断它能不能被比他小的所有素数整除,这是一个算法.(写到算法时,我只能写出用它除以比他小的所有数,造成运算速度低下)
    这里给出的是一个更快速的方法.要判断一个数是否为素数,只要判断比它开根号后的数小的数,能否把它整除.
    为什么可以这样做呢.从百度得到的答案如下:
    如果一个质数大于根号n,而n可以除尽它,那么n必然也可以除尽一个更小的质数。
    例如21,它可以除尽7,而它同样可以除尽3。所以判断21是否质数,只需要判断21是否可以除尽2和3就可以了。5和7和11就不需要判断了。
    想来就是这样,例如21.根号21乘根号21等于21.则当一个比根号21的数大的数乘另一个数得到21.另一个数必然小于根号21.
    由此可以得到一个法2较快的素数判断算法 

     

     

     

     

     

     

    展开全文
  • 判断一个数是不是质数(素数),3种方式介绍

    万次阅读 多人点赞 2018-06-10 09:56:59
    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。 0和1既不是质数也不是合数,最小的质数是2 二、方法介绍 1.最直观,但效率最低的写法 public static...

    一、概念介绍

        大家中学都学过,就不过多介绍了,大致提两点:

    •     质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
    •     0和1既不是质数也不是合数,最小的质数是2

     

    二、方法介绍

    1.最直观,但效率最低的写法

    public static boolean isPrime(int n){
        if (n <= 3) {
            return n > 1;
        }
        for(int i = 2; i < n; i++){
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

        这里特殊处理了一下小于等于3的数,因为小于等于3的自然数只有2和3是质数。

        然后,我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。

     

    2.初步优化

        假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我们可以改进上述方法优化循环次数。如下:

    public static boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        int sqrt = (int)Math.sqrt(n);
        for (int i = 2; i <= sqrt; i++) {
            if(n % i == 0) {
                return false;
            }
        }
        return true;
    }

     

    3.继续优化

        我们继续分析,其实质数还有一个特点,就是它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。

        如何论证这个结论呢,其实不难。首先 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数即可。

    public static boolean isPrime(int num) {
        if (num <= 3) {
            return num > 1;
        }
        // 不在6的倍数两侧的一定不是质数
        if (num % 6 != 1 && num % 6 != 5) {
            return false;
        }
        int sqrt = (int) Math.sqrt(num);
        for (int i = 5; i <= sqrt; i += 6) {
            if (num % i == 0 || num % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }

        对于输入的自然数 n 较小时,也许效果不怎么明显,但是当 n 越来越大后,该方法的执行效率就会越来越明显了。
        

    展开全文
  • 回文素数是指一个数既是素数也是回文数。例如:131既是素数也是回文数。编写程序显示钱100个回文素数。每行显示10个素数,并且能准确对齐 import math def is_palindrome(number): number_list = [] number_repeat =...
  • 素数回文

    千次阅读 2021-02-28 22:36:26
    现在给出一个素数,这个素数满足两点: 1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。 2、 位数从高到低为递减或递增,如2459,87631。 请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的...
  • C++判断素数(求素数

    万次阅读 多人点赞 2019-08-30 15:12:31
    素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除...
  • 素数、绝对素数、孪生素数

    千次阅读 2016-11-29 22:07:59
    素数,我们都知道,除了一和他本身,其他都不能整除的数,即为素数,数学上又称为质数。 绝对素数呢?这里给出一个定义,就是指本身是素数,其逆序数也是素数的数。例如:10321与12301是绝对素数。 接下来我们就来...
  • 素数问题

    万次阅读 2019-03-14 16:03:11
    素数问题
  • 如何判断素数

    万次阅读 多人点赞 2019-06-02 20:06:13
    素数(Prime number,又称质数),指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。大于1的自然数若不是素数,则称之为合数(也称为合成数)。例如...
  • 绝对素数

    2021-01-06 21:15:02
    如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13,试编程求出所有两位数中的绝对素数。 输入 无 输出 若干行,每行一个绝对素数,从小到大输出 #include <bits/stdc++.h> ...
  • 本题要求统计给定整数M和N区间内素数的个数并对它们求和。 ** 输入格式: ** 输入在一行中给出两个正整数M和N(1≤M≤N≤500)。 输出格式: ** 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔...
  • 判断素数

    千次阅读 2020-11-24 23:35:16
    判断素数 输入一个大于等于3的正整数,判断其是否是素数。 样例: 输入 5 6 输出 prime not prime /* 输入一个大于等于3的正整数,判断其是否是素数。 */ #include<iostream> using namespace std; int main...
  • 【算法】素数(质数)判断方法

    万次阅读 多人点赞 2017-11-29 17:05:32
    素数(质数)的判断在算法问题中经常遇到,这里小结几种常用的判断方法。首先,我们来看一下素数(质数)的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。...
  • 素数算法

    万次阅读 多人点赞 2016-09-19 21:23:00
    一、引言在平时做题目或者进行运算的时候,素数的出现次数总是十分频繁。这里总结了一些常见的判定素数和计算某个范围内素数个数的一些算法。部分代码来源于 kuangbin 的模板,嗯毕竟都是跟着这个学的...二、朴素...
  • 素数晒法求素数

    2018-02-24 20:37:48
    用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。用筛法求素数的基本...
  • C语言判断素数(求素数

    千次阅读 2020-10-30 11:27:24
    C语言判断素数(求素数素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ ...
  • 素数(孪生素数)是指一对差值为2的素数。例如:3和5就是一对双素数,5和7是一对双素数
  • 素数

    千次阅读 2019-05-29 09:26:54
    素数环:从1到n这n个数摆成一个环,要求相邻的两个数的和是一个素数。如,n=8是,素数环为: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 其总数为4 输入 n的值(n不大于15) 输出 ...
  • C语言求素数

    万次阅读 多人点赞 2018-08-17 10:30:00
    质数是指在大于1的自然数中,除了1和它本身...if(n%i==0)i在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数 #include <stdio.h> void main(){ int i,n; printf("Please input: "); sc...
  • 素数//素数

    千次阅读 2019-01-13 19:16:24
    枚举所有小于数,看是否它能整除其他自然数,但实际上只需要枚举根号次。 bool Is_prime(int n) ...•埃氏筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,285
精华内容 26,914
关键字:

素数