c语言--素数的查找

查找素数

普通版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void prime_num(int n)
{
int i = 0;
int j = 0;
for(i = 2; i < n; ++i){
for(j = 2; j <= i; ++j){
if(i % j == 0){
break;
}
}
if(j > i / 2){
printf("%d ", i);
}
}
}

普通版改进

2ii的约数是很浪费的,若整数i2根号i都不能被i整除,说明i就是素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void prime_num(int n)
{
int i = 0;
int j = 0;
float t = 0;
for(i = 0; i < n; ++i){
t = sqrt(i);
for(j = 2; j <= t; ++j){
if(i % j == 0){
break;
}
}
if(j > t){
printf("%d ", i);
}
}
printf("\n");
}

这种方法只适合比较少量的素数的判度,的值达到很大的时候,会很慢的说

筛选法

以空间来换取时间.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void prime_num(int n)
{
char *tag = (char *)malloc(n + 1);
int i = 0;
int j = 0;
float t = 0;
memset(tat, 0, n + 1);
t = sqrt(n);
//第一层循环只要i到达t就停止了,因为n约数至少有一个是在根号t以内,所以
//只要2-->t就可以把质数筛完
for(i = 2; i <=t; ++i){
if(!tag[i]){
for(j = 2 * i; j <= n; j = j + i){
tag[j] = 1; //把质数i的整数倍筛除掉
}
}
}
//n以内的质数的状态则都存在数组里面
}

Contents
  1. 1. 查找素数
    1. 1.1. 普通版
    2. 1.2. 普通版改进
    3. 1.3. 筛选法
,