几种素数的判定方法
2016-01-23 22:05
260 查看
(1)最基本素数判定方法大家熟悉,只用看看2到n(或n的平方根)之间有没有n的约数:
此方法适用于判定较少数,数据量大时会超时。
(2)筛选法求素数也重要的求素数方法之一。
这种方法主要用于打素数表,如求出n之内的所有素数,其思路是从1开始遇到一个素数就标记一下,并去掉n之内的大于它的所有倍数,直循环到n:
此方法也有局限性,数据量中等时才不会超时,数据量过大时也会超时,而且只能用素数打表,不能对单个数进行判定!
(3)这是我根据《离散数学》上的一个定理想到的,定理为:“若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数”,实现过程如下:
此方法可以对超大量数据的进行打表!
此方法也同样合适于素数打表,判定单个时这个方法不可取!
(4)由方法(3)延伸出另一个素数判定方法:
这种方法既可以用于最快速地判定单个数,也可以用于判定超大量的数据。
此方法判定单个数时要比第(1)种方法要快得多,用于大量数据素数打表时稍逊于第(3)种方法,却要比第(2)方法快得多。
这几判定素数方法中我个人认为第(4)种最好用,不过不容易理解,我也解释不清楚(只可意会,不可信传),大家看看哪个方法好用就用哪个吧!
#include<stdio.h> void main() { int i,n; scanf("%d",&n); for(i=2;i<n;i++) if(n%i==0)break; if(i<n||n==1)puts("No"); else puts("Yes"); }
此方法适用于判定较少数,数据量大时会超时。
(2)筛选法求素数也重要的求素数方法之一。
这种方法主要用于打素数表,如求出n之内的所有素数,其思路是从1开始遇到一个素数就标记一下,并去掉n之内的大于它的所有倍数,直循环到n:
#include<stdio.h> int n,i,j,a[1000001],p[100000],t=0; void main() { scanf("%d",&n); a[1]=0; for(i=2;i<=n;i++)a[i]=1; for(i=2;i<=n;i++) if(a[i]){ p[t++]=i; for(j=i+i;j<=n;j+=i)a[j]=0; } for(i=0;i<t;i++) printf("%d%c",p[i],i<t-1?' ':'/n'); }
此方法也有局限性,数据量中等时才不会超时,数据量过大时也会超时,而且只能用素数打表,不能对单个数进行判定!
(3)这是我根据《离散数学》上的一个定理想到的,定理为:“若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数”,实现过程如下:
#include<stdio.h> #include<math.h> int p[1000000],a[10000001],t=0; int prime(int n) { int i,q; q=(int)sqrt(n); for(i=0;p[i]<=q&&t;i++) if(n%p[i]==0)return 0; return 1; } void main() { int n,i; scanf("%d",&n); for(i=2;i<=n;i++) if(prime(i))p[t++]=i; for(i=0;i<t;i++) printf("%d%c",p[i],i<t-1?' ':'/n'); }
此方法可以对超大量数据的进行打表!
此方法也同样合适于素数打表,判定单个时这个方法不可取!
(4)由方法(3)延伸出另一个素数判定方法:
#include<stdio.h> #include<math.h> int p[8]={4,2,4,2,4,6,2,6}; int prime(int n) { int i=7,j,q; if(n==1)return 0; if(n==2||n==5||n==3)return 1; if(n%2==0||n%3==0||n%5==0)return 0; q=(int)sqrt(n); for(;i<=q;){ for(j=0;j<8;j++){ if(n%i==0)return 0; i+=p[j]; } if(n%i==0)return 0; } return 1; } void main() { int n; scanf("%d",&n); if(prime(n))puts("Yes"); else puts("No"); }
这种方法既可以用于最快速地判定单个数,也可以用于判定超大量的数据。
此方法判定单个数时要比第(1)种方法要快得多,用于大量数据素数打表时稍逊于第(3)种方法,却要比第(2)方法快得多。
这几判定素数方法中我个人认为第(4)种最好用,不过不容易理解,我也解释不清楚(只可意会,不可信传),大家看看哪个方法好用就用哪个吧!
相关文章推荐
- 关于栈、堆、静态变量区的访问效率
- 关于指针定义的一些问题
- 进制转换并打印
- 函数指针
- MinGW环境变量设置、CodeBlock添加额外的库
- websocket C/C++服务器应用
- #define do{}while(0)妙用
- 浅析pragma once与include guard
- 大小端模式
- Ubuntu14.04 学习二: C/C++环境搭建,执行第一个hello world
- 我所理解的makefile文件
- 对于VS中一些较严谨的(_s)函数如strcpy_s的第二个参数的问题
- [编程题]记负均正
- [编程题] 汽水瓶
- [编程题] 明明的随机数
- [编程题] 进制转换
- 类所占内存的大小
- C/C++琐碎知识归纳
- C++中不能重载的运算符
- 实型常量