求素数的几种方法

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

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;
}

用java求素数几种方法与优缺点

04-04

求100内的所有素数,这里有三种方法,如下rn[code=Java]rnpublic class Prime rn public static boolean isPrime(int num)rn for (int i = 2; i < num; i++) //运行效率不高rn if ((num % i) == 0) rn return false;rn rn rn return true;rn rn public static void main(String[] args)rn for(int i = 2; i <= 100; i++) rn if(isPrime(i))rn System.out.print(i + " ");rn rn rn rn[/code]rn[code=Java]rnpublic class TestPrime rn public static boolean isPrime(int num) rn for(int i = 2; i <= Math.sqrt(num); i++) //程序默认2是素数,当j=2时,循环不执行rn if(num % i == 0) rn return false;rn rn rn return true;rn rn public static void main(String[] args) rn for(int j = 2; j <= 100; j++) rn if(TestPrime.isPrime(j)) rn System.out.println(j + " is a prime");rn rn rn rn[/code]rn[code=Java]rnpublic class PrimeNumber rn//求100内的所有素数(质数)rn public static void main(String[] args) rn for(int i = 2;i <= 100;i++) rn for(int j = 2;j <= (int)Math.sqrt(i);j++) //把Math.sqrt(i)转换为int类形rn if(i % j == 0)rn break;rn rn if(j >= (int)Math.sqrt(i)) rn System.out.println(i + " is a prime");rn rn rn rn rn[/code]rn第一种和第二种方法都可以输出正确结果,但第三种方法只能输出5以后的数,2和3不能输出来,请各位帮我看下怎么改,rn另外,第一种方法看起来简单,但是效率不高,要循环的次数明显多于后面两种,所以第二种方法是最好的方法,也是最容易看懂的方法。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试