求素数的几种方法

原创 2018年04月17日 18:39:45

解题中,往往生成素数表,比对素数,求解快。

1.最经典的就是根据定义:如果一个正整数只有两个因子, 1和p,则称p为素数。

代码如下:

include<stdio.h>
#include<math.h>
bool is_primer(int x) {
        if(x<2)
                return false;
	if(x==2) 
		return true;
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0) 
			return false;
	return true;
}

时间复杂度:O(n);

2.改进, 偶数都可以被2整除,去掉所有偶数

代码如下


bool isPrime(int n) 
{     
	if(n < 2)
		return false;     
	if(n == 2)
		return true;     
	if(n%2 == 0)
		return false;      
	for(int i = 3; i < n; i += 2)         
		if(n % i == 0)
			return false;     
	return true; 
}

时间复杂度:O(n/2);提高了一倍


3. 进一步减少判断的范围

定理: 如果n不是素数, 则n有满足1证明: 如果n不是素数, 则由定义n有一个因子d满足1如果d大于sqrt(n), 则n/d是满足1代码如下


bool isPrime(int n)
{
    if(n < 2)
		return false;
    if(n == 2) 
		return true;
    if(n%2 == 0) 
		return false;
    int foo = (int)sqrt(n);
    for(int i = 3; i <= foo; i += 2)
        if(n%i == 0) 
			return false;
    return true;
}

时间复杂度O(sqrt(n)/2)


筛选法求素数

介绍:对于素数筛选法,具体方法就不阐述了,简单地说就是找到一个素数就把它的倍数标记为非素数。

include<stdio.h>
#include<string.h>
#define N 1000
int prime[N];
bool isprime[N];
void get_prime(int n) {
	memset(isprime, true, sizeof(isprime));
	int num=0;
	prime[num++]=2;
	for(int i=3;i<=n;i+=2)
		if(isprime[i]) {
			prime[num++]=i;
			for(int j=i+i;j<=n;j+=i)
				isprime[j]=false;
			/*代码优化:
			for(int j=i*i;j<=n;j+=i*2)*/
		}
	for(int k=0;k<num;k++)
		printf("%d\n", prime[k]);
}
 
int main() {
	int n=100;
	get_prime(n);
	return n;
}

求素数常用的几种方法

如何判断素数一个素是不是素数呢?或许你会以为这是一个非常简单问题,就像1+1=2一样,当一个数的因子只有1和它本身的时候就是素数,很简单的嘛!!!但是,当一个数特别大的时候就没有那么简单进行判断了。下...
  • PriestessofBirth
  • PriestessofBirth
  • 2018-03-04 11:37:45
  • 108

求解素数几种方法

转贴文章请注明:逸学堂 求解一个算法,我们首先要知道它的数学含义.依据这个原则,首先我们要知道什么是素数.; 素数是这样的整数,它除了表示为它自己和1的乘积以外,无论他表示为任何两个整数的乘积。找素数...
  • ugg
  • ugg
  • 2006-02-16 15:28:00
  • 3307

求素数的几种方法(C/C++)

//用筛选法查找100以内的素数 void printSushu() { int a[101]; int i; int j; //初始化数组 for (i = 1; i < 1...
  • hqm475
  • hqm475
  • 2011-05-21 17:36:00
  • 449

java用最简单的方法求质数

  面试题目:判断101-200之间有多少个素数(质数),并输出所有素数。程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数的平方根),如果能被整除, 则表明此数不是素数,反之是素数。  ...
  • jianchilu
  • jianchilu
  • 2018-03-04 21:35:16
  • 58

不同存储方式上求素数的

  • 2009年05月26日 06:52
  • 85KB
  • 下载

求素数的几种高效方法

转贴文章请注明:逸学堂 求解一个算法,我们首先要知道它的数学含义.依据这个原则,首先我们要知道什么是素数.; 素数是这样的整数,它除了表示为它自己和1的乘积以外,无论他表示为任何两个整数的乘积。找素数...
  • xuyang1205
  • xuyang1205
  • 2008-12-09 08:52:00
  • 8458

C语言求素数的两种方法

1,判断n是否能被1~n-1整除 #include int main() { int i, n; scanf("%d", &n); for (i = 2; i < n ; i...
  • cheng__lu
  • cheng__lu
  • 2018-02-07 09:33:07
  • 426

求素数算法-Java

例如求100以内的素数: 方法一:定义 素数:除了1和它本身以外不再被其他的除数整数。 for(int i=2; i...
  • dzh0622
  • dzh0622
  • 2016-07-19 15:50:12
  • 4896

java求素数的经典算法

  • 2008年04月27日 20:10
  • 1KB
  • 下载

求素数的MATLAB程序

  • 2008年11月19日 15:24
  • 220B
  • 下载
收藏助手
不良信息举报
您举报文章:求素数的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)